Clickhouse Engine kafka导入数据.docx
- 文档编号:23883203
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:6
- 大小:32.36KB
Clickhouse Engine kafka导入数据.docx
《Clickhouse Engine kafka导入数据.docx》由会员分享,可在线阅读,更多相关《Clickhouse Engine kafka导入数据.docx(6页珍藏版)》请在冰豆网上搜索。
ClickhouseEnginekafka导入数据
ClickhouseEnginekafka将kafka数据同步clickhouse
起因
由于需要做各种数据库摆渡到kafka的组件研究。
其中clickhouse和kafka间的数据摆渡,根据官方给出的kafka引擎文档,便有了我这篇实践记录。
相应的,该配置也非常简单。
官方传送门:
kafkaengineclickhouse
这边对数据库和kafka环境不再累述。
1、开发环境
kafka2.4
zookeeper3.4.5
clickhouse20.4.5.36
centos7
二、介绍
clickhouse支持kafka的表双向同步,其中提供的为Kafka引擎。
其大致情况为如下情况:
Kafka主题中存在对应的数据格式,Clickhouse创建一个Kafka引擎表(即相当于一个消费者),当主题有消息进入时,获取该消息,将其进行消费,然后物化视图同步插入到MergeTree表中。
该引擎还支持反向写入到Kafka中,即往Kafka引擎表中插入数据,可以同步到Kafka中(同样可以使用物化视图将不同引擎需要的表数据同步插入到Kafka引擎表中)。
下面为KafkaEngine的一些配置:
老版本格式为:
Kafka(kafka_broker_list,kafka_topic_list,kafka_group_name,kafka_format
[,kafka_row_delimiter,kafka_schema,kafka_num_consumers])
新版本格式为:
KafkaSETTINGS
kafka_broker_list='localhost:
9092',
kafka_topic_list='topic1,topic2',
kafka_group_name='group1',
kafka_format='JSONEachRow',
kafka_row_delimiter='\n',
kafka_schema='',
kafka_num_consumers=2
必填参数(例如topic、kafka集群、消费者组等):
1.kafka_broker_list–以逗号分隔的brokers列表(例如kafka1:
9092,kafka2:
9092,kafka3:
9092)。
2.kafka_topic_list–topic列表(你的topic名字,也可以多个)。
3.kafka_group_name–Kafka消费组名称(group1)。
如果不希望消息在集群中重复,请在每个分片中使用相同的组名。
4.kafka_format–消息体格式。
使用与SQL部分的FORMAT函数相同表示方法,例如JSONEachRow、CSV、XML等。
Formats格式传送门
非必填的参数:
1.kafka_row_delimiter-每个消息体(记录)之间的分隔符。
2.kafka_schema–如果解析格式需要一个schema时,此参数必填。
3.kafka_num_consumers–单个表的消费者数量。
默认值是:
1,如果一个消费者的吞吐量不足,则指定更多的消费者。
众所周知消费者的总数不应该超过topic中分区的数量,因为每个分区只能分配一个消费者。
三、实践
1.创建,使用引擎创建一个Kafka消费者并作为一条数据流
CREATETABLEqueue(
q_dateDate,
levelString,
messageString
)ENGINE=KafkaSETTINGSkafka_broker_list='k1:
9092,k2:
9092,k3:
9092',
kafka_topic_list='my_topic',
kafka_group_name='kafka_group_test',
kafka_format='CSV',
kafka_num_consumers=4;
消费的消息会被自动追踪,因此每个消息在不同的消费组里只会记录一次。
如果希望获得两次数据,则使用另一个组名创建副本。
消费组可以灵活配置并且在集群之间同步。
例如,如果群集中有10个主题和5个表副本,则每个副本将获得2个主题。
如果副本数量发生变化,主题将自动在副本中重新分配。
1.创建一个结构表
CREATETABLEdaily(
dayDate,
levelString,
messageString
)ENGINE=MergeTree(day,(day,level),8192);
1.创建物化视图,该视图会在后台转换引擎中的数据并将其放入之前创建的表中。
CREATEMATERIALIZEDVIEWconsumerTOdaily
ASSELECTq_dateASday,level,message
FROMqueue;
其中AS后面的语句是自己根据实际需求进行调整的。
为了提高性能,接受的消息被分组为max_insert_block_size大小的块。
如果未在stream_flush_interval_ms毫秒内形成块,则不关心块的完整性,都会将数据刷新到表中。
1.停止或者修改转换逻辑
detach物化视图
DETACHTABLEconsumer;
ATTACHTABLEconsumer;
1.在创建表前,需要在kafka创建一个topic用于测试
./bin/kafka-topic.sh--create--topicmy_topic--partitions3--replication-factor3
此处的topic需要与之前的kafka_topic_list对应,既然该参数为list,则可以配置多个topic
1.生产者往topic中生产数据
./bin/kafka-console-prodcer--topicmy_topic--broker-listk1:
9092
按照CSV格式,生产数据输入
2020-06-28level1message
2020-06-28level2message
2020-06-28level3message
此时查看表daily,数据已同步
select*fromdaily
|---day---level---message---|
|---2020-06-28---level1---message---|
|---2020-06-28---level2---message---|
|---2020-06-28---level3---message---|
同理,向kafka引擎表中插入数据,也可以在my_topic中可以消费到插入数据。
1.数据量测试
在该版本,我在kafka生产者客户端进行for循环2000w数据进行测试,延迟不高,基本在10秒内同步完成,不知道在表字段数量和复杂sql语句时情况如何。
还需要进一步进行实际使用
所遇问题
1.表结构变更
对于数据同步问题,其中一个就是表同步之间的结构对应问题。
由于表创建的时候,已经固定,所以ck的kafka引擎在遇到字段改变的时候,依然需要删表重建,或者修改物化视图进行不同的sql操作。
2.延迟问题
在之前的版本中,社区有人提出该同步延迟太高,特别是数据量大的时候,但是在我实际测试中,大约2000w简单单表同步延迟可以接受。
具体性能需要进一步测试。
3.format格式
对于自己规定的格式,一定要正确,比如csv就是csv,json就是json格式,不然会报错。
4.消费问题
前面说过,kafka引擎其实是一个或者多个消费者进行topic的消费,那必然就涉及到消费问题,如何重新消费,如何在需要修改业务的时候重新连接。
重置偏移量。
场景:
丢失数据,重新消费:
首先,我们可以将daily中的消息干掉,手动导致消息丢失(自己整一个消息丢失)
TRUNCATETABLEdaily
此时,daily数据被删除了,同步的数据丢失。
接下来,我们停止kafka引擎表,在clickhouse中执行
DETACHTABLEqueue
最后在kafka中,执行重置偏移量的命令
./bin/kafka-consumer-groups--bootstrap-serverk1:
9092--topicmy_topic--groupkafka_group_test--reset-offsets--to-earliest--excute
然后,重连queue表
ATTACHTABLEqueue
这样,就开始重新消费啦
1.错误日志
clickhouse日志查看为ck目录下的log文件夹的clickhouse-server.log中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Clickhouse Engine kafka导入数据 kafka 导入 数据