ClickHouse Kafka引擎表问题排查(一)
Clickhouse错误日志,一直刷新如下信息:
<Warning> StorageKafka (sync_kafka_device_location): Can't get assignment. It can be caused by some issue with consumer group (not enough partitions?). Will keep trying.
1、检查了,kafka、zookeeper未发下异常。
2、重启了clickhouse,错误依旧。
3、detach物化视图、产出kafka引擎表再重新创建,部分表恢复了,有的表错误依旧。
4、然后查看topic在不在
./kafka-topics.sh --describe --zookeeper 172.30.125.52:2181 --topic ck.device.location
发现topic不存在。
然后新建topic:
./bin/kafka-topics.sh --create --bootstrap-server 172.30.125.52:9092 --replication-factor 1 --partitions 3 --topic ck.device.location
然后问题解决,发现日志不再报错。
tail -f clickhouse-server.err.log | grep sync_kafka_device_location
总结了下,kafka引擎表出现这样的异常,可能的情况有:
1、kafka引擎表本身的配置问题。
比如,broker-list地址配置有误、消费者数大于分区数。
2、kafka问题
比如:kafka服务异常(分区不可用、Leader选举、zookeeper异常等)。
kafka引擎表的使用方式:
1、使用引擎创建Kafka使用者并将其视为数据流。
2、创建具有所需结构的表。
3、创建一个物化视图,该视图将转换来自引擎的数据并将其放入先前创建的表中。
当MATERIALIZED VIEW加入引擎时,它开始在后台收集数据。这样一来,您就可以持续接收来自Kafka的消息,并使用将它们转换为所需的格式SELECT。一个kafka表可以具有任意数量的实例化视图,它们不直接从kafka表中读取数据,而是接收新记录(以块为单位)。
为了提高性能,kafka引擎表会将接收到的消息分组为max_insert_block_size大小的块。如果未在stream_flush_interval_ms毫秒内形成该块,则无论该块的完整性如何,数据都将刷新到表中。两个参数的解释如下:
max_insert_block_size:插入表中要形成的块的大小。此设置仅在服务器构成块的情况下适用。对通过HTTP接口的INSERT,服务器解析数据格式并形成指定大小的块。默认1048576。默认值略大于max_block_size,这样做是因为某些表引擎(* MergeTree)在磁盘上为每个插入的块形成了一个数据部分,这是一个相当大的实体。类似地,* MergeTree表在插入期间对数据进行排序,并且足够大的块大小允许对RAM中的更多数据进行排序。
stream_flush_interval_ms:在超时或线程生成max_insert_block_size行的情况下,适用于具有流式传输的表,默认7500。值越小,将数据刷新到表中的频率越高。将该值设置得太低会导致性能下降。