今天使用 Datax 往 ClickHouse 同步数据时,出现如下错误:
ClickHouse exception, code: 1002, host: 10.129.170.80, port: 8123; Code: 252. DB::Exception: Too many parts (300). Merges are processing significantly slower than inserts. (TOO_MANY_PARTS) (version 22.3.2.1)
Too many part 异常原因:当数据插入到 ClickHouse 表时,每一批插入都会生成对应 parts 文件,ClickHouse 后台会有合并小文件的操作。当插入速度过快,生成 parts 小文件过多时,ClickHouse 无法以适当的速度合并这些 parts 时会报上面这个错误。
例如并发数为 200,这样一批写入到 ClickHouse 中就会产生 200 个文件,几批下来如果 ClickHouse 内部线程没来及合并相同分区,就会抛异常
而 ClickHouse 默认一次合并超过 300 个文件就会报错,来看一下配置:
parts_to_throw_insert
如果单个分区中的活动部件数量超过了parts_to_throw_insert 值,则 INSERT 会中断,出现 Too many parts (N). Merges are processing significantly slower than inserts 异常。
可能的值:任意正数。
默认值: 300.
为了实现 SELECT 查询的最大性能,有必要最小化处理的部分数量,请参阅 Merge Tree。
你可以将一个较大的值设置为 600(1200),这将降低 Too many parts 错误的概率,但同时 SELECT 性能可能会降低。此外,在合并问题(例如,由于磁盘空间不足)的情况下,你会在与原始 300 相比晚一点发现该问题。
详细信息可参考官网解释:ClickHouse 官网解释
定位到了问题,来看一下解决方案:
1、写入 ClickHouse 的并发数调小,批处理的数据 batchSize 间隔调大,比如之前 200 并发调整到 50 并发,从之前一批 1w 条数据调整到 5w 条数据,从而减少 ClickHouse 文件的个数,避免超过 parts_to_throw_insert 默认值。
一般此种方法就可以解决上述问题。
2、如果第一种方法不管用,可以尝试增加可合并的分区数,修改 ClickHouse 配置:
<merge_tree>
<parts_to_delay_insert>600</parts_to_delay_insert>
<parts_to_throw_insert>600</parts_to_throw_insert>
<max_delay_to_insert>2</max_delay_to_insert>
<max_suspicious_broken_parts>5</max_suspicious_broken_parts>
</merge_tree>
保存后重启即可。