ClickHouse升级后无法读取Kafka tombstone消息,如何用RawBLOB处理?
解决ClickHouse RawBLOB模式读取Kafka Tombstone消息的问题
针对ClickHouse 21.9及以上版本无法读取Kafka tombstone(value为null)消息的问题,核心解决思路是关闭默认的null消息跳过机制,并配合Nullable字段类型接收消息:
步骤1:创建支持Tombstone的Kafka Engine表
在创建Kafka表时,显式添加kafka_skip_null_messages='0'参数关闭null消息跳过,同时将消息字段定义为Nullable(String):
CREATE TABLE kafkatable0 ( message Nullable(String) ) ENGINE = Kafka( 'broker:29092', 'topic1', 'group0', 'RawBLOB', 'kafka_skip_null_messages=0' );
步骤2:调整物化视图兼容旧版本行为
如果需要和旧版本(21.2)一样将null转为空字符串,可以在物化视图中用coalesce函数处理:
CREATE TABLE table0 (key String, message String) ENGINE = MergeTree() ORDER BY key; CREATE MATERIALIZED VIEW mv0 TO table0 AS SELECT _key as key, coalesce(message, '') as message FROM kafkatable0;
关键说明
- 新版本ClickHouse默认开启
kafka_skip_null_messages=1,会自动跳过value为null的tombstone消息,必须显式设置为0才能接收这类消息。 - 若需要处理key为null的场景,可使用
_raw_key虚拟列(类型为Nullable(String))替代_key,例如coalesce(_raw_key, '') as key。
验证结果
按上述配置后,发送的3条消息(包括key2的tombstone)都会被正常读取,最终table0中会有3条数据,与旧版本行为一致。
内容的提问来源于stack exchange,提问作者John A.
相关产品推荐
相关产品推荐

