打造全新批流融合:详解 Apache Flink 1.14.0 发布的 Pulsar Flink Connector

作者简介 盛宇帆,StreamNative 开发工程师,Apache Pulsar 与 Apache Flink 贡献者。加入 StreamNative 之前,他曾就职于阿里大数据平台和腾讯云负责 Flink 开发工作。盛宇帆是腾讯云项目 Barad 的核心 committer 与项目落地负责人。他目前在 StreamNative 负责 Pulsar-Flink 和 Pulsar-Spark 相关的开发工作,他和他的团队已经将 Pulsar Source Connector 贡献给 Flink 社区,并于 Apache Flink 1.14.0 发布,并将在后续的发布中完整地将 Pulsar Connector 贡献给社区。

编辑:Jipei@StreamNative,Apache Pulsar 贡献者。

本文摘要

•批流一体是数据计算的未来趋势,Pulsar Flink Connector 为基于 Apache Pulsar 在 Apache Flink 上以批流一体的方式处理数据提供了理想的解决方案。•StreamNative 已将 Pulsar Source Connector 贡献至 Flink 1.14.0 版本。用户可以使用它从 Pulsar 读取数据,并保证每条数据只被处理一次。•最新 Pulsar Flink Connector 基于 Pulsar 2.8.0 和 Flink 1.14 版本,支持 Pulsar 的事务处理,进一步融合了两者的特性。

背景

随着数据日益膨胀,采用事件流处理数据至关重要。Apache Flink 将批流处理统一到计算引擎中,提供了一致化的编程接口。Apache Pulsar(与 Apache BookKeeper 一起)以 "流 "的方式统一数据。在 Pulsar 中,数据存储成一个副本,以流(streaming)(通过 pub-sub 接口)和 segment(用于批处理)的方式进行访问。Pulsar 解决了企业在使用不同的存储和消息技术解决方案时遇到的数据孤岛问题。

Flink 可以直接与 Pulsar broker 进行实时的流式读写,同时 Flink 也可以批量读取 Pulsar 底层离线存储,与 BookKeeper 的内容进行批次读写。同时支持批流,使得 Pulsar 和 Flink 先天就是契合的伙伴。把 Flink 和 Pulsar 结合使用,这两种开源技术可以创建一个统一的数据架构,为实时数据驱动企业提供最佳解决方案。

为了将 Pulsar 与 Flink 的功能进行整合,为用户提供更强大的开发能力,StreamNative 开发并开源了 Pulsar Flink Connector。经过多次的打磨,Pulsar Flink Connector 已合并进 Flink 代码仓库,并在 Flink 1.14.0 版本中发布!

Pulsar Flink Connector 基于 Apache Pulsar 和 Apache Flink 提供弹性数据处理,允许 Apache Flink 读写 Apache Pulsar 中的数据。使用 Pulsar Flink Connector,企业能够更专注于业务逻辑,无需关注存储问题。

打造全新的 Pulsar Flink Connector

在此版本之前,StreamNative 已发布 Pulsar Flink Connector 2.7 版本。为什么要推翻之前的代码,重新打造批流融合呢?在新版本中进行了哪些重构呢?

d01b48e0625d7bade8a716c04a1528f7.png

新版本改动

拆分设计

所有的数据消费都是基于 split(分流) 创建 Reader 去消费数据。如何将 Pulsar 消息抽象为 split?首先我们对 topic 进行抽象,针对每一个分区创建 Partition 示例。对有分区的 topic 就按数量创建,而对无分区的 topic 只有 1 个 partition,其值为 -1。

f452ff606cf27a5458f29dc1b1e83641.png

在 Pulsar 的 exclusive(独占)、shared(共享)和 failover(灾备)订阅模式中,我们将 topic partition 包装为在 Flink 上消费的 split,其中包含消费节点、存储节点和两个特殊的状态,最后消费的消息 ID 和当前处理的事务 ID 分别用于 Pulsar 的不同模式。在 Pulsar 的 key_shared (键共享)模式中,在 topic partition 和 split 间映射的时候增加了 range 层。

e8c2e0a2b46f9229ced1d63edef9c56f.png

针对每个分区创建 split 的原因在于:

•Pulsar 的分区实际也是 topic;•Topic 分区实际是子 topic;•仅可在单一 topic 上执行 Consumer.seek()

枚举器(enumerator)设计

枚举器对应 split 分发和订阅的接口。这个设计注意分成两个部分,一部分是基于 TopicList,对于用户给定的一组 topic,从 Pulsar 进行信息查询;另一部分是 Topic Pattern,查询当前 topic、正则匹配并创建 split。

在 exclusive(独占)、key_shared(键共享)和 failover(灾备)模式中,一个 split 只会被以轮循的方式分配给一个 reader。

00e9855066a3e4a7457340ed9baa52ab.png

f6256db936bcf09704a20bf747052fed.png

cd26c5660dcf74ff6f053a858cc9542d.png

5efb544c6a1a7745b1df7888c7d5cc3b.png

在 shared(共享)模式中,每个 split 会分给每个 reader,在此模式中,每个 reader 会消费 Pulsar 的每个 partition。

785071d90f067572c018d2380dc0712e.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值