Bootstrap

DB::Exception: Too many parts (300)解决方法


前言

clickhouse频繁插入数据时出现DB::Exception: Too many parts (300)
通常是因为ClickHouse在插入数据时生成了太多的parts文件,而这些文件合并的速度跟不上插入的速度,导致超过了默认的parts_to_throw_insert值,即300个parts。

1、报错问题

DB::Exception: Too many parts (300)
在这里插入图片描述

2、解决方法

2.1、方法1

  • 修改clickhouse中的config.xml文件,添加以下配置参数(尝试增加可合并的分区数,修改ClickHouse配置文件中的<merge_tree>标签)
<merge_tree>
	<parts_to_delay_insert>600</parts_to_delay_insert>
	<parts_to_throw_insert>600</parts_to_throw_insert>
	<max_delay_to_insert>5</max_delay_to_insert>
	<max_suspicious_broken_parts>5</max_suspicious_broken_parts>
</merge_tree>
  • 修改后,重启clickhouse

2.2、方法2

减少并发数:降低写入ClickHouse的并发数,增加每批处理的数据量。例如,将200并发调整到50并发,每批数据量从1万条调整到5万条,这样可以减少生成的parts文件数量,避免超过默认值。

2.3、方法3

优化Merge线程池大小:通过设置background_pool_size参数来优化,这个参数通常设置为CPU核心数的两倍。如果修改后仍然出现问题,可能需要临时调整其他参数,例如number_of_free_entries_in_pool_to_lower_max_size_of_merge,以允许表正常进行merge操作

2.4、方法4

存储方式优化:对于数据量较小的情况,可以选择Compact存储方式,以减少merge的压力和时间。对于数据量大的情况,使用Wide存储方式

2.5、方法5

合理设置分区:如果每次插入涉及的分区太多,可能会导致异常和插入耗时。合理设置分区字段,避免每次插入请求涉及过多分区

2.6、方法6

设置数据过期时间:如果单表存储的数据量过大,建议设置数据的过期时间,或者采用其他数据库存储过大数据量的表

总结

以上方案,仅供参考

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;