1、写本地表(推荐使用spark),查询分布式表,提升写入和查询性能,保证写入和查询的数据一致 性。

2、外部模块保证数据导入的幂等性。

建议创建入数任务应该按照对应分区去创建,ClickHouse不支持数据写入的事务保证。通过外部导入数据模块控制数据的幂等 性,比如某个批次的数据导入异常,则drop对应的分区数据或清理掉导入的数据 后,重新导入该分区或批次数据。

3、大批量少频次的写入。

ClickHouse的每次数据插入,都会生成一到多个part文件,如果data part过多, merge压力会变大,甚至出现各种异常影响数据插入。建议一次插入10到百万 行,写入字段不能太多,太多字段情况下要减少写入行数,以降低对写入节点的 内存和CPU压力,每秒不超过1次插入。

4、多副本并行导入。

有大数据的导出场景,建议将数据提前拆分成多份,(拆分其实很简单,文件结尾可以按0至9取模,然后按照对应的文件为每个任务的入库源数据)在一个shard内的多个副本同 时导入(也就是说每个分区内多并发的进行clickHouse多个shard同时入库),以分摊一个节点导入数据的压力,同时能提升数据入库的性能,缩短入 库时间。 常见错误:Too many parts(304). Merges are processingsignificantly slower than inserts。 原因分析:MergeTree的merge的速度跟不上目录生成的速度,数据目录越来越多 就会抛出这个异常。

建议:

1、一次只插入一个分区内的数据,如果数据属于不同的分区,则每次插入,不同分区的数据会独立生成part文件, 导致part总数量膨胀,建议一批插入的数据属于同一个分区。

2、写入速率 单节点写入速度为50~200MB/S,如果写入的数据每行为1Kb,那么写入的速度为 50,000到200,000行每秒,如果行数据容量更小,那么写入速度将更高,如果 写入性能不够,可以使用多个副本同时写入,同一时间每个副本写入的数据保持 均衡。

3、慎用分布式表批量插入

4、大批量数据导入要分时、分节点、扩容