跳至主要内容

将 Kafka 与 ClickHouse 集成

Apache Kafka 是一个开源的分布式事件流平台,被数千家公司用于高性能数据管道、流式分析、数据集成和关键任务应用程序。在大多数涉及 Kafka 和 ClickHouse 的情况下,用户希望将基于 Kafka 的数据插入 ClickHouse。下面我们概述了这两种用例的几种选择,并确定了每种方法的优缺点。

选择选项

在将 Kafka 与 ClickHouse 集成时,您需要尽早做出有关所用高级方法的架构决策。我们将在下面概述最常见的策略

用于 Kafka 的 ClickPipes(ClickHouse 云)

  • ClickPipes 提供了将数据摄取到 ClickHouse 云的最简单、最直观的方式。目前支持 Apache Kafka、Confluent Cloud 和 Amazon MSK,更多数据源即将推出。

第三方云端 Kafka 连接性

自管理 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 物化视图。