前言
项目采用Flink、Kafka、Clickhouse的实时数仓架构,数据由Kafka接入,经过Flink处理,写入Clickhouse。
初期直接由Flink写入Clickhouse,经常会出现分区太多合并不来等意外情况,效果不是很好。而且数据也需要共享到其他地方,故直接写入CK对我们来说不是很好的选择。
于是先将数据写入Kafka,之后由Kafka对数据进行分发。
从Kafka写入CK有很多种方法:
- 使用Flink Connector
- 使用github上开源的kafka ck组件
- 使用CK的Kafka表引擎
为了便于维护、降低成本,决定探索下使用CK的Kafka表引擎来写入数据。
Kafka表引擎
简介
CK的Kafka表引擎就是集成了Kafka,在CK端可以查询、写入Kafka。
原理就是CK作为Kafka的生产者或者消费者来生产消费数据,实现数据的同步。
建表
建表语法
和其他表引擎类似,只不过ENGINE为Kafka()
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE =
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
– topic 列表 (my_topic
)。kafka_group_name
– Kafka 消费组名称 (group1
)。如果不希望消息在集群中重复,请在每个分片中使用相同的组名。kafka_format
– 消息体格式。使用与 SQL 部分的FORMAT
函数相同表示方法,例如JSONEachRow
。了解详细信息,请参考Formats
部分。
可选参数:
-
kafka_row_delimiter
- 每个消息体(记录)之间的分隔符。 -
kafka_schema
– 如果解析格式需要一个 schema 时,此参数必填。 -
kafka_num_consumers
– 单个表的消费者数量。默认值是:1
,如果一个消费者的吞吐量不足,则指定更多的消费者。消费者的总数不应该超过 topic 中分区的数量,因为每个分区只能分配一个消费者。 -
kafka_max_block_size
轮询的最大批处理大小(以消息为单位)(默认值:max_block_size)。 -
kafka_skip_broken_messages
Kafka消息解析器对每个块的架构不兼容消息的容忍度。默认值:0。如果kafka_skip_broken_messages = N,则引擎会跳过N条无法解析的Kafka消息(消息等于一行数据)。 -
kafka_commit_every_batch
写入整个块后,提交每个消耗和处理的批处理,而不是单个提交(默认值:0)。 -
kafka_thread_per_consumer
为每个消费者者提供独立的线程(默认值:0)。启用后,每个消费者将并行并行地刷新数据(否则,来自多个消费者的行将被压缩以形成一个块)。
其他参数
- <