暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Timeplus Proton现已原生支持面向ClickHouse的流式处理和ETL

ClickHouseInc 2024-07-29
302

本文字数:6225估计阅读时间:16 分钟
作者:Jove Zho
原文链接:https://www.timeplus.com/post/proton-clickhouse-integration


Meetup活动

ClickHouse 广州首届 Meetup 讲师招募中,欢迎讲师在文末扫码报名!


十分高兴地想向大家介绍我们的开源核心引擎Timeplus Proton这一次的重大升级:你现在可以使用Timeplus Proton直接与ClickHouse集成。Proton现在允许开发者将流式SQL结果发送到ClickHouse,并在ClickHouse中读取数据或应用SQL JOIN,这一升级让大家无需重复存储就可方便使用。

无论你使用ClickHouse Cloud还是ClickHouse的本地/自建版本,Proton都允许你在Apache Kafka或Redpanda中处理实时数据,并将其发送到ClickHouse进行快速可靠的实时流式分析。

如果你更偏向于通过实践来学习,欢迎观看我们的产品负责人钟钱杰(Jove Zhong)录制的视频演示,进一步了解如何设置Proton和ClickHouse的集成:

喜欢ClickHouse和Kafka?
就让Proton带你走向更高水准

Apache Kafka和ClickHouse是两个广泛使用并受到尊重的开源项目,因此开发者常常会一起使用。

ClickHouse的文档中指出:“Apache Kafka是一个开源的分布式事件流平台,被数千家公司用于高性能数据流水线、流式分析、数据集成和关键任务应用。在涉及Kafka和ClickHouse的大多数情况下,用户希望将基于Kafka的数据插入到ClickHouse中。”

上述ClickHouse文档中所列出的几种选项,可供希望连接Kafka和ClickHouse的开发者选择,同时ClickHouse也指出了每种方法的权衡利弊。


可用于评价
ClickPipes for KafkaClickHouse Cloud是一个将数据导入到ClickHouse Cloud的简单直观方法
Kafka Connect自托管或托管在Confluent Cloud、Amazon MSK等服务中Apache Kafka的免费开源组件,作为一个集中的数据中心,用于实现Kafka与其他数据系统之间的简单数据集成
ClickHouse Kafka table engine自托管的ClickHouse(不适用于ClickHouse Cloud)从数据源系统中拉取数据。这需要ClickHouse直接访问Kafka
Vector自托管一个不受供应商偏好的数据管道


除了这些选项外,其他常见的工具包括Apache Flink或Apache Spark,它们也能够让你从Kafka API读取数据并将处理后的数据发送到ClickHouse。

每种方法都有其优缺点。一些关键的决策点包括:

  • 连接性:你是否可以接受Kafka部署和ClickHouse部署之间的双向连接?你可能需要设置VPC对等连接或防火墙策略,以便你的ClickHouse服务器可以与Apache Kafka通信,或者Kafka Connect可以将数据发送到ClickHouse服务器。

  • 处理的逻辑:许多工具可以直接将Kafka消息“转发”到ClickHouse,或者应用简单的转换逻辑。你是否需要有状态的处理,例如滚动/跳跃/会话窗口的聚合,延迟事件处理,甚至是复杂事件处理(CEP)?

  • 部署占用空间和成本:像Kafka Connect、Flink或Spark这样的工具需要你设置和维护一个重型集群。也有一些云端的解决方案,但这会涉及额外的网络对等连接和成本问题。


Proton和ClickHouse的集成:
一个更好的流式处理方式

在Timeplus,我们重视简单性和性能。这就是我们喜欢ClickHouse的原因,也是我们构建Proton的核心。我们在Proton 1.4及更高版本中提供了一个原生的Proton-ClickHouse集成,使开发者能够从Kakfa读取数据,应用流式SQL,并将数据发送到ClickHouse。

对于喜欢将Kafka和ClickHouse结合使用的开发者来说,Proton与ClickHouse的集成提供了一种更多快好省的方式来管理复杂的流式处理和ETL。

使用Proton-ClickHouse集成的主要优势包括:

  • Proton可以在任何地方部署,占用空间极小。你不必担心Kafka集群与你所选择的ClickHouse部署之间的连接性,因为它们不必直接通信。例如,如果你正在使用ClickHouse Cloud,并在自己的数据中心中运行一个具有低延迟要求的Kafka集群,那么Proton可以部署在你的Kafka集群周围的防火墙后面。你不需要在Kafka设置中添加ClickHouse Cloud的IP和端口白名单。Proton是用C++编写的,不依赖JVM或任何其他组件,因此你只需使用二进制文件或docker/kubernetes部署Proton。

  • Proton比Vector更强大,比Apache Flink或ksqlDB更轻量级。你的确无需进行太多修改就可以使用Vector将Kafka数据转发到ClickHouse,但Proton提供了与FlinkSQL或ksqlDB一样强大的流式SQL功能,但速度更快、更轻量级。你可以轻松将FlinkSQL或ksqlDB中的工作负载迁移到Proton。(你可以在这里找到Proton和ksqlDB的比较:Proton:流式处理工具ksqlDB的开源替代方案

  • Proton高效处理高负荷的流式数据。当Kafka主题中每秒有成千上万甚至数百万条新消息时,Proton可以通过流批一体的处理和聚合来吸收负载,然后将数据发送到ClickHouse。这将帮助ClickHouse服务器减少合并负载并避免写入放大和元数据压力。这使得Proton比将Kafka数据根据逐个事件写入ClickHouse更有效率。


Proton+ClickHouse使用案例:

一种更佳搭配!

我们已经看到了一些令人兴奋的Proton+ClickHouse的使用案例,例如:

  • 数据工程师需要一个快速轻量级的解决方案来处理Kafka中的流式数据,将数据发送到ClickHouse,并在需要时将数据卸载到数据仓库。

  • 网络运维团队需要监控大容量和高频率的网络事件,进行实时网络分析,以及从边缘或云端进行网络安全检测。

  • 金融科技交易团队需要高效地连接不同数据流,并轻松访问强大的统一分析工具,以符合法规、降低风险并提高收益。

更多Timeplus Proton的使用案例请查看:https://docs.timeplus.com/showcases

教程

准备好亲自试用了吗?这里有一个示例,演示了如何在Redpanda(一个用于Apache Kafka的快速轻量级的替代品)中读取实时数据,应用流式ETL,并将数据发送到你的本地ClickHouse或ClickHouse Cloud中。本文的末尾还提供了一个更高级的用例。

一个简单的流程图展示了可视化的构建模块

Docker Compose栈已开源,请访问:https://github.com/timeplus-io/proton/tree/develop/examples/clickhouse获取,其中也包括了示例SQL语句。当你启动该栈时,最新版本的Proton和ClickHouse,以及Redpanda和数据生成器将自动启动。

如果你想要在没有Docker的情况下安装 Proton,只需运行以下命令:

    curl https://install.timeplus.com | sh

    首先,在你的ClickHouse中使用常规的MergeTree表引擎创建一个表。

      CREATE TABLE events
      (
      _tp_time DateTime64(3),
      url String,
      method String,
      ip String
      )
      ENGINE=MergeTree()
      PRIMARY KEY (_tp_time, url);

      这将作为Proton对ClickHouse的外部表目的地。之后,你还可以在Proton中读取数据。

      在演示的Docker Compose栈中会启动一个Redpanda容器,以及一个数据生成器和Redpanda控制台,方便你轻松地探索实时数据。例如,访问http://localhost:8080,你将看到owlshop-frontend-events主题中的实时数据。

      本教程的目标是读取这些访问日志,并将敏感的IP地址转换为md5,然后将其摄入到ClickHouse进行更多的业务分析。

      要从Kafka或Redpanda中读取数据,你只需创建一个带有以下DDL SQL的外部流:

        CREATE EXTERNAL STREAM frontend_events(raw string)
        SETTINGS type='kafka',
        brokers='redpanda:9092',
        topic='owlshop-frontend-events';

        然后运行以下DDL SQL来设置Proton和ClickHouse之间的连接。对于没有安全设置的本地ClickHouse,可以简单地执行如下:

          CREATE EXTERNAL TABLE ch_local
          SETTINGS type='clickhouse',
          address='localhost:9000',
          table='events';

          如果你正在使用ClickHouse Cloud,请确保设置了secure=true。

            CREATE EXTERNAL TABLE ch_cloud
            SETTINGS type='clickhouse',
            address='abc.aws-or-gcp.clickhouse.cloud:9440',
            user='default',
            password='..',
            secure=true,
            table='events';

            然后创建一个物化视图用于从Redpanda中读取数据,提取数值并将IP转换为屏蔽的md5,并将数据发送到外部表。通过这样做,转换后的数据将持续写入ClickHouse。

              CREATE MATERIALIZED VIEW mv INTO ch_local AS
              SELECT now64() AS _tp_time,
              raw:requestedUrl AS url,
              raw:method AS method,
              lower(hex(md5(raw:ipAddress))) AS ip
              FROM frontend_events;

              一旦创建了物化视图,它将作为Proton中的后台ETL作业,持续从Kafka/Redpanda读取数据,应用转换或聚合,然后将结果发送到ClickHouse。要了解有关Proton中的物化视图的更多信息,请参阅:https://docs.timeplus.com/view#m_view。

              现在,如果你回到ClickHouse并运行select * from events,你将看到新的数据以亚秒的延迟速度展现出来。

              你可以在Proton中使用流式SQL做更多的事情,例如延迟事件处理、复杂事件处理,或者利用成千上万的ClickHouse函数来定制转换/增强逻辑。Proton的许多功能都由ClickHouse提供支持。因此,如果你已经是ClickHouse用户,可以通过类似的方式使用Proton。

              如上所述,Proton中的外部表可用于从ClickHouse中读取数据,甚至可以在流式JOIN中应用数据查找。只需在Proton中运行SELECT .. FROM external_table_name。它将从ClickHouse读取所选列的数据,并在Proton中应用转换或JOIN。

              一个典型的用例是,如果你在ClickHouse中有静态或变化缓慢的维度(SCD),你无需在Proton中进行复制。只需在Proton中创建一个外部表,然后通过将流式数据与此外部表进行JOIN,来增强你的实时数据,并将高质量的数据发送到ClickHouse。

              例如:

                -- read the dimension table in ClickHouse without copying data to Proton
                CREATE EXTERNAL TABLE dim_path_to_title
                SETTINGS type='clickhouse',address='localhost:9000';


                -- read Kafka data with subsecond latency
                CREATE EXTERNAL STREAM clickstream(
                ts datetime64,
                product_id int,
                ip string
                )
                SETTINGS type='kafka',brokers='kafka:9092',topic='clickstream';


                -- continuously write to ClickHouse
                CREATE EXTERNAL TABLE target_table
                SETTINGS type='clickhouse',address='localhost:9000',table='pageviews';


                -- downsample the click events per 5 seconds and enrich URL paths with page titles
                CREATE MATERIALIZED VIEW mv INTO target_table AS
                WITH pv AS(
                SELECT window_start, path, count() AS views
                FROM tumble(clickstream,ts,5s) GROUP BY window_start,path)
                SELECT window_start AS ts,path,title,views
                FROM pv JOIN dim_path_to_title USING(path);

                总结

                ClickHouse是用于实时应用和分析的相对快速和资源高效的开源数据库。Proton提供了快速轻量级的流式SQL功能。在Proton的新版本中,我们增加了这两个强大引擎之间的原生集成。对于喜欢ClickHouse的开发者,我们提供了一种灵活的解决方案,可以在你想要的任何地方部署,并以亚秒的低延迟读取或写入ClickHouse数据。


                最近 ClickHouse 官方首次推出了 ClickHouse 认证开发人员(点击查看详情)的考试。提升您的职业生涯至行业顶尖水平!报名参加我们的官方 ClickHouse 认证考试,证明您的 ClickHouse 专业技能。

                提示:我们正在开通国内购买渠道,请大家积极填写认证考试意愿到场问卷,敬请期待


                Meetup 活动讲师招募

                我们正为广州活动招募讲师,如果你有独特的技术见解、实践经验或 ClickHouse 使用故事,非常欢迎你加入我们,成为这次活动的讲师,与大家分享你的经验。

                点击此处或扫描下方二维码,立刻报名成为讲师!

                征稿启示

                面向社区长期正文,文章内容包括但不限于关于 ClickHouse 的技术研究、项目实践和创新做法等。建议行文风格干货输出&图文并茂。质量合格的文章将会发布在本公众号,优秀者也有机会推荐到 ClickHouse 官网。请将文章稿件的 WORD 版本发邮件至:Tracy.Wang@clickhouse.com

                文章转载自ClickHouseInc,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论