跳到主要内容
版本:0.2.x

配置后台任务

常用命令

启动/停止表的 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_taskfalse, 允许更多的 merge 任务同时运行配合 max_addition_bg_task_num 一起使用。
max_addition_bg_task_num200, 限制最大的并发任务数量
max_partition_for_multi_select3, 选多少个 partitions 来 mergemerge 会先选 partitions,再从 partitions 中选 range。如果是多 partition key(比如 appid, date)通常需要将这个值调大,因为 partition 很多。
////// 提高每次选 range 的速度 //////数据量大的时候,每次 select 都非常耗时,期望通过batch加速。
cnch_merge_enable_batch_selectfalse, 是否开启 batch_selectbatch_select 会每 round 选一大批 ranges,之后的 round 会直接 submit 这些 range,能让 merge 的触发周期缩短,从而让总任务量真正达到并发上限。
cnch_merge_max_total_rows_to_merge15000000, 单个 merged part 的最大行数当业务很清楚 level0 part 行数以及期望控制 merge 后的整体数量(影响查询时间)时,比较管用。
////// 实时数据优化 //////实时场景
cnch_merge_only_realtime_partitionfalse, 是否只选 realtime partition每 round 选 partitions 时,会选 N 个 count 多的 partition,N 个 realtime partition。如果 enable 这个 setting,则只会按 realtime 程度(min_block)选 partition。 实时表场景会很有用。
max_bytes_to_merge_at_max_space_in_pool150 1024 1024 * 1024, 即 150GB。单 merge 任务最大 bytes 限制。参数名看起来不够直观,遗留代码问题... cnch 里面这个参数被用在了设置 merge selector 的 max size 上。功能类似 cnch_merge_max_total_rows_to_merge,一个限制行数,一个限制 bytes 数。
cnch_vw_writevw_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 的情况。