Clickhouse Engine kafka 将kafka数据同步clickhouse

本篇文章转自:https://blog.csdn.net/weixin_41461992/article/details/106790507

起因

由于需要做各种数据库摆渡到kafka的组件研究。
其中clickhouse和kafka间的数据摆渡,根据官方给出的kafka引擎文档,便有了我这篇实践记录。
相应的,该配置也非常简单。

官方传送门: kafka engine clickhouse

这边对数据库和kafka环境不再累述。

一、开发环境

kafka 2.4
zookeeper 3.4.5
clickhouse 20.4.5.36
centos7

二、 介绍

clickhouse支持kafka的表双向同步,其中提供的为Kafka引擎。

其大致情况为如下情况:Kafka主题中存在对应的数据格式,Clickhouse创建一个Kafka引擎表(即相当于一个消费者),当主题有消息进入时,获取该消息,将其进行消费,然后物化视图同步插入到MergeTree表中。
在这里插入图片描述
该引擎还支持反向写入到Kafka中,即往Kafka引擎表中插入数据,可以同步到Kafka中(同样可以使用物化视图将不同引擎需要的表数据同步插入到Kafka引擎表中)。
在这里插入图片描述
下面为Kafka Engine的一些配置:
老版本格式为:

Kafka(kafka_broker_list, kafka_topic_list, kafka_group_name, kafka_format
      [, kafka_row_delimiter, kafka_schema, kafka_num_consumers])

新版本格式为:

Kafka SETTINGS
  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消费者并作为一条数据流。
CREATE TABLE queue (
    q_date Date,
    level String,
    message String
  ) ENGINE = Kafka SETTINGS kafka_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. 创建一个结构表
CREATE TABLE daily (
    day Date,
    level String,
    message String
) ENGINE = MergeTree(day, (day, level), 8192);
  1. 创建物化视图,该视图会在后台转换引擎中的数据并将其放入之前创建的表中。
CREATE MATERIALIZED VIEW consumer TO daily
    AS SELECT q_date AS day, level, message
    FROM queue;

其中AS后面的语句是自己根据实际需求进行调整的。
为了提高性能,接受的消息被分组为max_insert_block_size大小的块。如果未在stream_flush_interval_ms毫秒内形成块,则不关心块的完整性,都会将数据刷新到表中。

  1. 停止或者修改转换逻辑
    detach物化视图
DETACH TABLE consumer;
ATTACH TABLE consumer;
  1. 在创建表前,需要在kafka创建一个topic用于测试。
./bin/kafka-topic.sh --create --topic my_topic --partitions 3 --replication-factor 3

此处的topic需要与之前的kafka_topic_list对应,既然该参数为list,则可以配置多个topic

  1. 生产者往topic中生产数据
./bin/kafka-console-producer.sh --topic my_topic --broker-list k1:9092

按照CSV格式,生产数据输入

2020-06-28 level1 message
2020-06-28 level2 message
2020-06-28 level3 message

此时查看表daily,数据已同步

select * from daily
|--- 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中的消息干掉,手动导致消息丢失(自己整一个消息丢失)

TRUNCATE TABLE daily

此时,daily数据被删除了,同步的数据丢失。
接下来,我们停止kafka引擎表,在clickhouse中执行

DETACH TABLE queue

最后在kafka中,执行重置偏移量的命令

./bin/kafka-consumer-groups --bootstrap-server k1:9092 --topic my_topic --group kafka_group_test --reset-offsets --to-earliest --excute

然后,重连queue表

ATTACH TABLE queue

这样,就开始重新消费啦

  1. 错误日志
    clickhouse日志查看为ck目录下的log文件夹的clickhouse-server.log中。
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ClickHouse是一个高性能的列式数据库管理系统,可以与各种数据源进行集成,包括Kafka消息队列。集成Kafka可以让ClickHouse实时消费Kafka中的数据,并将其存储到ClickHouse中进行分析和查询。下面是将ClickHouse集成Kafka的一些步骤: 1. 安装KafkaClickHouse 首先要安装KafkaClickHouseKafka可以从官网下载最新版本的程序包。ClickHouse也可以从官网下载相应的程序包进行安装。 2. 创建Kafka主题 在Kafka中创建一个主题,用于存储要传输到ClickHouse数据。可以使用Kafka自带的命令行工具创建主题。例如: ``` bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic clickhouse_topic ``` 3. 安装Kafka引擎插件 ClickHouse提供了Kafka引擎插件,可以通过它与Kafka进行集成。可以从ClickHouse官网下载最新的引擎插件,并将其安装到ClickHouse中。安装完成后,需要重新启动ClickHouse服务。 4. 创建表 在ClickHouse中创建表,用于存储从Kafka中读取的数据。可以使用以下命令创建表: ``` CREATE TABLE kafka_table (key String, value String) ENGINE = Kafka('localhost:9092', 'clickhouse_topic', 'group1', 'JSONEachRow'); ``` 其中,'localhost:9092'是Kafka集群的地址,'clickhouse_topic'是要消费的主题名称,'group1'是消费者组的名称,'JSONEachRow'表示从Kafka中读取的消息是JSON格式。 5. 查询数据ClickHouse中使用SELECT语句查询从Kafka中读取的数据。例如: ``` SELECT * FROM kafka_table; ``` 这将返回存储在kafka_table表中的所有数据。 以上是将ClickHouse集成Kafka的基本步骤,可以根据具体情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值