ClickHouse Kafka表引擎使用详解

本文详细介绍了如何使用ClickHouse的Kafka表引擎进行数据同步,包括从Kafka写入CK和CK写入Kafka的实现方式,以及各种参数配置与优化技巧,以提升性能和降低维护成本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

项目采用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_messagesKafka消息解析器对每个块的架构不兼容消息的容忍度。默认值:0。如果kafka_skip_broken_messages = N,则引擎会跳过N条无法解析的Kafka消息(消息等于一行数据)。

  • kafka_commit_every_batch写入整个块后,提交每个消耗和处理的批处理,而不是单个提交(默认值:0)。

  • kafka_thread_per_consumer为每个消费者者提供独立的线程(默认值:0)。启用后,每个消费者将并行并行地刷新数据(否则,来自多个消费者的行将被压缩以形成一个块)。

其他参数
  • format_csv_delimiter当格式类型为CSV相关的时候,可以通过这个参数来指定CSV的分隔符
建表示例
CREATE TABLE IF NOT EXISTS test_ck_sync
### 关于 ClickHouseKafka 集成的最佳实践 #### 使用场景概述 ClickHouse 是一款高性能列式数据库管理系统,适用于实时分析大规模数据集。Kafka 则是一个分布式流处理平台,能够高效地处理大量消息。两者结合可以实现高效的日志收集、监控数据分析以及实时报表等功能。 #### 架构设计原则 为了使 ClickHouse 能够有效地从 Kafka 中读取并存储数据,在架构上应当考虑以下几点: - **解耦生产者消费者**:通过让 ClickHouse 成为 Kafka 的一个消费者来接收来自不同源头的数据流[^1]。 - **支持多种文件系统和云储存**:虽然 ClickHouse 不依赖 HDFS 进行工作,但它可以通过 API 或其他方式连接到各种外部资源,包括但不限于 FTP、S3 等云端服务。 #### 实现方案详解 ##### 安装配置组件 确保环境中已经安装好最新版本的 ClickHouse 及其 Kafka 插件,并正确设置了 Zookeeper 地址以便管理 topic metadata。 ```bash sudo apt-get install clickhouse-server-common clickhouse-client librdkafka-dev ``` ##### 创建表结构定义 在 ClickHouse 内创建用于保存 Kafka 数据的目标表格时,需指定 `Kafka` 引擎作为引擎类型,并设置相应的参数如 broker list 和 topics name。 ```sql CREATE TABLE kafka_table ( timestamp DateTime, message String ) ENGINE = Kafka() SETTINGS kafka_broker_list = 'localhost:9092', kafka_topic_list = 'test-topic', kafka_group_name = 'clickhouse-consumer-group'; ``` ##### 处理接收到的消息 当消息被成功消费之后,通常还需要进一步转换清洗才能存入最终的目的地表中。这一步骤可通过 Materialized View 来完成自动化的ETL操作。 ```sql CREATE MATERIALIZED VIEW mv_kafka_to_destination TO destination_table AS SELECT * FROM kafka_table; ``` 以上就是关于如何最佳地将 ClickHouseKafka 结合使用的介绍。这种组合不仅提高了系统的灵活性还增强了可扩展性和性能表现。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值