真实起一个Kafka broker,验证Kafka Engine表直接SELECT时默认的安全护栏,以及开启后消费掉数据的真实行为。
代码-- 真实的Kafka topic,生产3条消息 kafka-topics.sh --create --topic events ... echo '{"id":1,...}\n{"id":2,...}\n{"id":3,...}' | kafka-console-producer.sh --topic events CREATE TABLE demo.kafka_src (id UInt32, name String, amt Float64) ENGINE = Kafka SETTINGS kafka_broker_list='127.0.0.1:19200', kafka_topic_list='events', kafka_group_name='ch_group1', kafka_format='JSONEachRow'; SELECT * FROM demo.kafka_src; -- 直接查会怎样?
SELECT * FROM demo.kafka_src ORDER BY id; → DB::Exception: Direct select is not allowed. To enable use setting `stream_like_engine_allow_direct_select`, but be aware that usually the read data is removed from the queue. (QUERY_NOT_ALLOWED)
ClickHouse真实默认不让你直接SELECT一张Kafka Engine表,报错信息本身就写明了真实的原因——直接查询会把读到的数据从队列里真实移除。
第1次 SELECT * FROM demo.kafka_src ORDER BY id; → 1 alice 10.5 2 bob 20 3 carol 30.5 第2次(同样的查询,同一个consumer group): → (空,一行都没有)
每一步都是本文上面用真实Kafka broker跑出来的原始结果。
ENGINE = Kafkastream_like_engine_allow_direct_select 与 system.kafka_consumers