[Recap] 人工智能大会 | 基于 Pulsar 和 Flink 进行批流一体的弹性数据处理_Pulsar

 

阅读本文需要约 5 分钟。

 

2019 年 8 月 31 日,第二届人工智能大会在上海举办。StreamNative 的 申毅杰受邀参加本次分享,发表“基于 Apache Pulsar 和 Apache Flink 进行批流一体的弹性数据处理”主题演讲。

申毅杰 

Apache Pulsar/Spark Contributor

开源爱好者

 

[Recap] 人工智能大会 | 基于 Pulsar 和 Flink 进行批流一体的弹性数据处理_Pulsar _02

 

趋势和挑战

 

企业通过各种端口收集的实时数据越来越多,如需挖掘数据背后的价值,则需通过流式处理、图像处理和机器学习等方式。因此,流数据的分析与处理是大势所趋。数据分析层已存在批流融合的趋势,数据存储也需要升级。目前的挑战是云架构的兼容性问题与生命周期内的数据迁移问题。

 

为什么选择 Apache Pulsar

 

[Recap] 人工智能大会 | 基于 Pulsar 和 Flink 进行批流一体的弹性数据处理_Pulsar _03

 

首先,Pulsar 是一个云原生的架构。Pulsar 内部分成两层,上层是无状态 Broker,下层是持久化的存储层 Bookie 集群,而且 Pulsar 存储是分片的,这种构架可以避免扩容时受限制。其次,Pulsar 的分层存储(tiered storage)可以不需要用户显式迁移数据,减少存储成本并保持近似无限的存储。最后,Pulsar 提供内置 Schema,可以保持服务器端数据的一致性,也能直接接受和发送类型数据。

 

Pulsar Flink Connector

 

StreamNative 已经开源了基于 Flink 1.9.0 和 Pulsar 2.4.0 的 Pular Flink Connector,实现了 exactly-once 语义的 Source 和 at-least-once 语义的 Sink。同时,基于 Pulsar 的内置 Schema 支持,提供了 Topic 内消息的自动序列化、反序列化。Pulsar Flink Connector 从本质上也是在利用 Pulsar Client API 操作 Pulsar,一些 connector 实现的相关思考可能同时对大家使用 Pulsar 有所帮助。

 

基于 Checkpoint 的异常处理

 

在 Flink 和 Spark 中,为了实现数据处理的 exactly-once 语义,要求数据源本身具有可重放和有序两大特征。Pulsar 的 Topic 存储是同时满足这两种语义的,你可以通过记录消费的 Message Id,并在任务失败时根据 Message Id 对该部分的计算进行重做(seek and receive)。同时,Pulsar 会自动删除已经被消费过的消息,因此为了保证在处理生效前数据不丢失(消息处理生效的标志是此消息所属的 checkpoint 完成),需要额外维护一个持久化的指针,指向作业当前 checkpoint 到的位置。每当一个 checkpoint 完成,再移动相应指针,通知 Pulsar 可以安全删除消息。如下图所示,connector 在收到 Flink 的完成 checkpoint N+1 消息后,将持久化指针向前移动。

 

[Recap] 人工智能大会 | 基于 Pulsar 和 Flink 进行批流一体的弹性数据处理_人工智能_04

 

两层的数据读取 API

 

Pulsar 向外暴露了 Topic 级的读接口(reader 和 consumer),同时由于 Pulsar 是基于分片的数据存储方式,我们也可以像 Presto SQL 使用 Pulsar 一样,直接访问 Bookie 来读取 Topic 中的数据,以获得更高的读数据并行度。

 

Topic / Partition 的动态发现

 

流数据分析应用是长时间执行的,因此在分析应用执行期间,Topic 的分区或者用户订阅的 Topic 会动态增删。为了使我们的流计算应用可以感知这种变化,可以启动一个定时任务,定期检查是否新增 Topic,并启动 reader 处理数据。

 

读写有类型消息(typed message)

 

Pulsar 内置了对数据 Schema 的支持,用户能直接向 Pulsar 发送或从 Pulsar 消费有类型的数据。Pulsar Flink connector 也使用了 Pulsar Schema,将 Pulsar Topic 作为一张有结构的表提供给 Flink 使用。同时,将用户可能感兴趣的一些消息的元信息以 meta fields 暴露给用户,包括:__key, __publishTime, __eventTime, __messageId, __Topic。

 

未来展望

 

  • 端到端 exactly-once 支持,当 Pulsar 在 2.5.0 版本提供事务支持后,我们会借助 Flink 的两阶段提交 Sink 接口在 Flink 中支持端到端的 exactly-once 语义支持。 

  • 基于 FLIP-27,支持在批、流查询中读写 Pulsar Topic 数据。 

  • 基于 Pulsar 的 key-shared 订阅模式和粘性读 consumer,实现在 Topic 级别提升数据消费的并行度。

  • 将 Pulsar 作为 Flink 的可选状态后端,提供对 Flink 的持久化。

 

作者 | Irene

审校 | Anonymitaet + Yijie

编辑 | Irene

 

[Recap] 人工智能大会 | 基于 Pulsar 和 Flink 进行批流一体的弹性数据处理_Pulsar _05