将 Kafka 与 ClickHouse 集成
Apache Kafka 是一个开源的分布式事件流平台,被数千家公司用于高性能数据管道、流式分析、数据集成和关键任务应用程序。在大多数涉及 Kafka 和 ClickHouse 的情况下,用户希望将基于 Kafka 的数据插入 ClickHouse。下面我们概述了这两种用例的几种选择,并确定了每种方法的优缺点。
选择选项
在将 Kafka 与 ClickHouse 集成时,您需要尽早做出有关所用高级方法的架构决策。我们将在下面概述最常见的策略
用于 Kafka 的 ClickPipes(ClickHouse 云)
- ClickPipes 提供了将数据摄取到 ClickHouse 云的最简单、最直观的方式。目前支持 Apache Kafka、Confluent Cloud 和 Amazon MSK,更多数据源即将推出。
第三方云端 Kafka 连接性
Confluent Cloud - Confluent 平台提供了将数据上传并 在 Confluent Cloud 上运行 ClickHouse 连接器 Sink 的选项,或者使用 用于 Confluent 平台的 HTTP Sink 连接器,该连接器通过 HTTP 或 HTTPS 将 Apache Kafka 与 API 集成。
Amazon MSK - 支持 Amazon MSK Connect 框架,将数据从 Apache Kafka 集群转发到 ClickHouse 等外部系统。您可以在 Amazon MSK 上安装 ClickHouse Kafka Connect。
Redpanda Cloud - Redpanda 是一个与 Kafka API 兼容的流式数据平台,可以用作 ClickHouse 的上游数据源。托管的云平台 Redpanda Cloud 通过 Kafka 协议与 ClickHouse 集成,为流式分析工作负载启用实时数据摄取
自管理 Kafka 连接性
- Kafka Connect - Kafka Connect 是 Apache Kafka 的一个免费开源组件,用作 Kafka 与其他数据系统之间简单数据集成的集中式数据中心。连接器提供了一种简单的方法,可以可扩展且可靠地将数据流式传输到 Kafka 和从 Kafka 流式传输数据。源连接器将数据从其他系统插入 Kafka 主题,而 Sink 连接器将数据从 Kafka 主题交付到其他数据存储,如 ClickHouse。
- Vector - Vector 是一个与供应商无关的数据管道。它能够从 Kafka 读取数据并将事件发送到 ClickHouse,这代表了一种强大的集成选项。
- JDBC Connect Sink - Kafka Connect JDBC Sink 连接器允许您将数据从 Kafka 主题导出到任何具有 JDBC 驱动程序的关系数据库
- 自定义代码 - 在需要对事件进行自定义处理的情况下,使用 Kafka 和 ClickHouse 的相应客户端库的自定义代码可能适合。这超出了本文档的范围。
- Kafka 表引擎 提供了原生 ClickHouse 集成(ClickHouse 云不可用)。此表引擎会拉取来自源系统的数据。这需要 ClickHouse 直接访问 Kafka。
- 带有命名集合的 Kafka 表引擎 - 使用命名集合提供了与 Kafka 的原生 ClickHouse 集成。这种方法允许安全地连接到多个 Kafka 集群,集中配置管理并提高可扩展性和安全性。
选择方法
它归结为几个决策点
连接性 - 如果 ClickHouse 是目标,则 Kafka 表引擎需要能够从 Kafka 中拉取数据。这需要双向连接。如果存在网络隔离,例如 ClickHouse 在云中,而 Kafka 是自管理的,您可能不愿出于合规性和安全原因删除它。(这种方法目前在 ClickHouse 云中不受支持。)Kafka 表引擎利用 ClickHouse 本身内的资源,使用线程作为消费者。由于资源限制,将这种资源压力放在 ClickHouse 上可能不可行,或者您的架构师可能更喜欢分离关注点。在这种情况下,可能更适合使用 Kafka Connect 等工具,这些工具作为独立进程运行,可以部署在不同的硬件上。这允许负责拉取 Kafka 数据的进程独立于 ClickHouse 进行扩展。
在云上托管 - 云供应商可能会对其平台上提供的 Kafka 组件设置限制。请按照指南探索每个云供应商的推荐选项。
外部丰富 - 虽然可以在插入 ClickHouse 之前通过在物化视图的 select 语句中使用函数来操作消息,但用户可能更愿意将复杂的丰富操作移到 ClickHouse 的外部。
数据流方向 - Vector 仅支持将数据从 Kafka 传输到 ClickHouse。
假设
上面链接的用户指南假设以下内容
- 您熟悉 Kafka 基础知识,如生产者、消费者和主题。
- 您已准备好了用于这些示例的主题。我们假设所有数据都以 JSON 格式存储在 Kafka 中,尽管如果使用 Avro,原理仍然相同。
- 我们在我们的示例中使用了优秀的 kcat(以前称为 kafkacat)来发布和使用 Kafka 数据。
- 虽然我们参考了一些用于加载示例数据的 python 脚本,但请随时将这些示例调整到您的数据集。
- 您大体上熟悉 ClickHouse 物化视图。