Kakfa
使用方式
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = Kafka()
SETTINGS
kafka_broker_list = 'host:port',
kafka_topic_list = 'topic1,topic2,...',
kafka_group_name = 'group_name',
kafka_format = 'data_format'[,]
[kafka_row_delimiter = 'delimiter_symbol',]
[kafka_schema = '',]
[kafka_num_consumers = N,]
[kafka_max_block_size = 0,]
[kafka_skip_broken_messages = N,]
[kafka_commit_every_batch = 0,]
[kafka_thread_per_consumer = 0]
kafka_broker_list
:逗号分隔的brokers地址 (localhost:9092).kafka_topic_list
:Kafka 主题列表,多个主题用逗号分隔.kafka_group_name
:消费者组.kafka_format
– Message format. 比如JSONEachRow
、JSON、CSV等等
使用示例
在kafka
中创建chouse
主题,并向该主题写入数据
kafka-topics.sh \
--zookeeper mypc01:2181,mypc02:2181,mypc03:2181/kafka-2020 \
--create \
--topic chouse \
--partitions 2 \
--replication-factor 2
在clickhouse
中创建表格
CREATE TABLE kafka_table
(
id UInt64,
name String
)
ENGINE = Kafka() SETTINGS kafka_broker_list = 'mypc01:9092,mypc02:9092,mypc03:9092',kafka_topic_list = 'chouse',kafka_group_name = 'group1',kafka_format = 'JSONEachRow';
创建生产者发送数据
[root@node1 kafka_2.11-1.1.1]# kafka-console-producer.sh --topic chouse --broker-list mypc01:9092,mypc02:9092,mypc03:9092
{"id":2,"name":"ww"}
-- 查询
select * from kafka_table ;
注意点
当我们一旦查询完毕之后,ClickHouse
会删除表内的数据,其实Kafka
表引擎只是一个数据管道,我们可以通过物化视图的方式访问Kafka
中的数据。
- 首先创建一张
Kafka
表引擎的表,用于从Kafka
中读取数据 - 然后再创建一张普通表引擎的表,比如
MergeTree
,面向终端用户使用 - 最后创建物化视图,用于将
Kafka
引擎表实时同步到终端用户所使用的表中
-- 创建Kafka引擎表
CREATE TABLE kafka_table_consumer
(
id UInt64,
name String
)
ENGINE = Kafka() SETTINGS kafka_broker_list = 'mypc01:9092,mypc02:9092,mypc03:9092',kafka_topic_list = 'test',kafka_group_name = 'group2',kafka_format = 'JSONEachRow';
-- 创建一张终端用户使用的表
CREATE TABLE kafka_table_mergetree (id UInt64 ,name String)ENGINE=MergeTree() ORDER BY id;
-- 创建物化视图,同步数据
CREATE MATERIALIZED VIEW consumer TO kafka_table_mergetree AS SELECT id,name FROM kafka_table_consumer;
-- 查询,多次查询,已经被查询的数据依然会被输出
select * from kafka_table_mergetree;
┌─id─┬─name─┐
│ 2 │ ww │
└────┴──────┘