配置后台任务
常用命令
启动/停止表的 Merge
-- 启动 merge
system start merges xxx.yyy;
-- 停止 merge
system stop merges xxx.yyy;
手动触发 merge
-- 触发一次merge 调度(和上面自动流程相同)
optimize table xxx.yyy;
-- 触发一次指定partition下的merge调度
optimize table xxx.yyy partition 'zzz';
此外,还可以有 dry run 模式,方便查看接下来 merge 能选出哪些 part(或者排查为什么选不出 part)
-- 打开tracelog,执行try optimize的时候
-- 会打印整个merge select过程的相关日志,
-- 比如选了哪些partition,哪些part,merge任务发给了哪个worker等。
set send_logs_level = 'trace';
try optimize table xxx.yyy;
try optimize table xxx.yyy partition 'zzz';
修改 merge 参数
alter table xxx.yyy modify setting cnch_merge_zzz = www;
观测
注意选择表的 host server。
system.bg_threads 可以查看表的 Merge/GC 后台线程运行状态。
system.manipulations 可以查看当前正在运行的 Merge 任务。
system.server_part_log 可以查看历史 Merge 任务的信息。(新 insert 的 part 也可以看这个表)。
Settings
配置项 | 默认值, 含义 | 备注 |
---|---|---|
////// 多 partition ////// | 最早每次只选一个 partition,并发不够。改多 partition 期望提高并发。 | |
enable_addition_bg_task | false, 允许更多的 merge 任务同时运行 | 配合 max_addition_bg_task_num 一起使用。 |
max_addition_bg_task_num | 200, 限制最大的并发任务数量 | |
max_partition_for_multi_select | 3, 选多少个 partitions 来 merge | merge 会先选 partitions,再从 partitions 中选 range。如果是多 partition key(比如 appid, date)通常需要将这个值调大,因为 partition 很多。 |
////// 提高每次选 range 的速度 ////// | 数据量大的时候,每次 select 都非常耗时,期望通过batch加速。 | |
cnch_merge_enable_batch_select | false, 是否开启 batch_select | batch_select 会每 round 选一大批 ranges,之后的 round 会直接 submit 这些 range,能让 merge 的触发周期缩短,从而让总任务量真正达到并发上限。 |
cnch_merge_max_total_rows_to_merge | 15000000, 单个 merged part 的最大行数 | 当业务很清楚 level0 part 行数以及期望控制 merge 后的整体数量(影响查询时间)时,比较管用。 |
////// 实时数据优化 ////// | 实时场景 | |
cnch_merge_only_realtime_partition | false, 是否只选 realtime partition | 每 round 选 partitions 时,会选 N 个 count 多的 partition,N 个 realtime partition。如果 enable 这个 setting,则只会按 realtime 程度(min_block)选 partition。 实时表场景会很有用。 |
max_bytes_to_merge_at_max_space_in_pool | 150 1024 1024 * 1024, 即 150GB。单 merge 任务最大 bytes 限制。 | 参数名看起来不够直观,遗留代码问题... cnch 里面这个参数被用在了设置 merge selector 的 max size 上。功能类似 cnch_merge_max_total_rows_to_merge,一个限制行数,一个限制 bytes 数。 |
cnch_vw_write | vw_default, 执行 merge 用的 vw | 咨询 sre 可以知道自己业务应该使用哪个 vw 作为 write vw |
cnch_merge_pick_worker_algo | 'RM', 选 worker 时的算法,默认从 RM 挑选。 | 并发量大时需要设置为'RoundRobin' |
使用说明
- 如果表规模不大(百万量级),但是当前 parts 比较多,想加快 merge 频率,通常 enable_addition_bg_task = 1 max_partition_for_multi_select 会有效果。这时候对应的 max_addition_bg_task_num 是 merge 并发量的上限。
- 如果表规模很大了(千万, 上亿),(每次从 catalog 获取 parts 耗时就会很长),这时候可能不仅要 enable_addition_bg_task, 还需要使用 cnch_merge_enable_batch_select = 1 来增加每次 merge select 的结果。
- 关于 cnch_merge_only_realtime_partition 和 max_partition_for_multi_select。 通常 kafka 实时表会使用 cnch_merge_only_realtime_partition,它表示每次选 partition 的时候只选 min_block 最新的,partition 数量由 max_partition_for_multi_select 控制。注意:如果是一个离线表且每天产生大量的新 partition,此时打开 cnch_merge_only_realtime_partition 并且 max_partition_for_multi_select 设置得很小的话,那会出现当天有 partition 无法参与 merge 的情况。