如何确保使用ClickhouseIO时每秒插入1次



我使用Apache Beam Java SDK处理事件并将其写入Clickhouse数据库。幸运的是,已经准备好使用ClickhouseIO了。

ClickhouseIO累积元素并批量插入,但由于管道的并行性,在我的情况下,它仍然会导致每秒插入大量元素。我经常在Clickhouse中收到"DB::Exception:Too many parts"或"DB::Exception:Too manic concurrent querys"。

Clickhouse文档建议每秒插入一次。有没有一种方法可以通过ClickhouseIO确保这一点?也许在ClickhouseIO之前进行一些KV分组。写什么?

看起来您对这些错误的解释不太正确:

DB::异常:部件过多

这意味着insert影响的分区比允许的多(默认情况下,此值为100,由参数max_partitions_per_insert_block管理(。

因此,要么受影响分区的数量非常大,要么partition BY键的定义非常精细。

如何修复:

  • 尝试对INSERT批进行分组,使其包含与少于100个分区相关的数据
  • 尝试减小插入块的大小(如果它非常大(-使用MaxInsertBlockSize
  • 在SQL查询中增加max_partitions_per_insert_block的限制(就像这样,insert..SETTINGS max_partitions _per_insert _block=300(我认为ClickhouseIO应该能够在查询级别设置自定义选项((或在服务器端通过修改用户配置文件设置

DB::异常:同时查询过多

这个由param max_concurrent_queries管理。

如何修复:

  • 通过Beam方法减少并发查询的数量
  • 在用户配置文件或服务器设置中增加服务器端的限制(请参阅https://github.com/ClickHouse/ClickHouse/issues/7765)

最新更新