Pravega Flink connector 的过去、现在和未

2021-07-16  本文已影响0人  Flink中文社区

本文整理自戴尔科技集团软件工程师周煜敏在 Flink Forward Asia 2020 分享的议题《Pravega Flink Connector 的过去、现在和未来》,文章内容为:

  1. Pravega 以及 Pravega connector 简介
  2. Pravega connector 的过去
  3. 回顾 Flink 1.11 高阶特性心得分享
  4. 未来展望

一、Pravega 以及 Pravega connector 简介

img

Pravega 项目的名字来源于梵语,意思是 good speed。项目起源于 2016 年,基于 Apache V2 协议在 Github 上开源,并且于 2020 年 11 月加入了 CNCF 的大家庭,成为了 CNCF 的 sandbox 项目。

Pravega 项目是为大规模数据流场景而设计的,弥补传统消息队列存储短板的一个新的企业级存储系统。它在保持对于流的无边界、高性能的读写上,也增加了企业级的一些特性:例如弹性伸缩以及分层存储,可以帮助企业用户降低使用和维护的成本。同时我们也在存储领域有着多年的技术沉淀,可以依托公司商用存储产品为客户提供持久化的存储。

img

以上的架构图描述的是 Pravega 典型的读写场景,借此进行 Pravega 术语介绍以帮助大家进一步了解系统架构。

二、Pravega Flink connector 的过去

img

Pravega Flink connector 是 Pravega 最初支持的 connector,这也是因为 Pravega 与 Flink 的设计理念非常一致,都是以流为基础的批流一体的系统,能够组成存储加计算的完整解决方案。

1. Pravega 发展历程

img

2. Checkpoint 集成实现

img

以 Kafka 为例,可以首先来看一下 Kafka 是如何做到 Flink Checkpoint 的集成的。

上图所示是一个典型的 Kafka "读" 的架构。基于 Chandy-Lamport 算法的 Flink checkpoint实现,当Job master Trigger 一个 Checkpoint 时,会往 Task Executor 发送 RPC 请求。其接收到之后会把自身状态存储中的 Kafka commit offset 合并回 Job Manager 形成一个 Checkpoint Metadata。

仔细思考后,其实可以发现其中的一些小问题:

img

基于这些不足之处,Pravega 有自己内部设计的 Checkpoint 机制,我们来看一下它是怎么和 Flink 的 Checkpoint 进行集成的。

同样读取 Pravega Stream。开始 Checkpoint 这里就有不同,Job master 不再向 Task Executor 发送 RPC 请求,转而以 ExternallyInducedSource 的接口,向 Pravega 发送一个 Checkpoint 的请求。

同时,Pravega 内部会利用 StateSynchronizer 组件来同步和协调所有的 reader,并且会在所有的 reader 之间,发送 Checkpoint 的 event。当 Task Executor 读到 Checkpoint Event 之后,整个 Pravega 会标志着这个 Checkpoint 完成,然后返回的 Pravega Checkpoint 会存到 Job master state 当中,从而完成 Checkpoint。

这样的实现其实对于 Flink 来说是更干净的,因为它没有耦合外部系统的实现细节,整个 Checkpoint 的工作是交给 Pravega 来实现并完成的。

三、回顾 Flink 1.11 高阶特性心得分享

Flink 1.11 是 2020 年的一个重要发布版本,对 connector 而言其实也有非常多的挑战,主要集中在两个 FLIP 的实现:FLIP-27 以及 FLIP-95。对于这两个全新功能,团队也花了很多时间去集成,在过程中也遇到了一些问题和挑战。下面我们来向大家分享一下我们是如何踩坑和填坑的。本文会以 FLIP-95 为例展开。

1. FLIP-95 集成

img

FLIP-95 是新的 Table API,其动机和 FLIP-27类似,也是为了实现批流一体的接口,同时也能更好地支持 CDC 的集成。针对冗长的配置键,也提出了相应的 FLIP-122 来简化配置键的设定。

1.1 Pravega 旧的 Table API

img

从上图可以看到 Pravega 在 Flink 1.10 之前的一个 Table API,并且从图中建表的 DDL 可以看到:

针对这些问题,我们也就有了非常大的动力去实现这样一套新的 API,让用户更好的去使用表的抽象。整个框架如图所示,借由整个新框架的帮助,所有的配置项通过 ConfigOption 接口定义,并且都集中在 PravegaOptions 类管理。

img

1.2 Pravega 全新 Table API

下图是最新 Table API 建表的实现,和之前的相比有非常大的简化,同时在功能上也有了不少优化,例如企业级安全选项的配置,多 stream 以及起始 streamcut 的指定功能。

img

2. Flink-18641 解决过程心得分享

img

接下来,我想在此分享 Flink 1.11 集成的一个小的心得,是关于一个 issue 解决过程的分享。Flink-18641 是我们在集成 1.11.0 版本时碰到的问题。升级的过程中,在单元测试中会报 CheckpointException。接下来是我们完整的 debug 过程。

我们也总结了以下一些注意事项给到在做开源社区的同胞们:

其实作为中国的开发人员,有除了像 mailing list 和 JIRA 之外。我们也有钉钉群以及视频的方式可以联系到非常多的 Committer。其实更多的就是一个交流的过程,做开源就是要和社区多交流,可以促进项目之间的共同成长。

四、未来展望

img

最后也希望社区的小伙伴可以多多的关注 Pravega 项目,促进 Pravega connector 与 Flink 的共同发展。

上一篇 下一篇

猜你喜欢

热点阅读