Flink如何管理Kafka的消费偏移量

在这篇文章中我们将结合例子逐步讲解 Flink 是如何与 Kafka 工作来确保将 Kafka Topic 中的消息以 Exactly-Once 语义处理。

检查点(Checkpoint)是一种能使 Flink 从故障恢复的内部机制。检查点是 Flink 应用程序状态的一致性副本,包括了输入的读取位点。如果发生故障,Flink 通过从检查点加载应用程序状态来恢复应用程序,并从恢复的读取位点继续处理,就好像什么事情都没发生一样。你可以把检查点理解为电脑游戏的存档。如果你在游戏中存档之后发生了什么事情,你可以随时读档重来一次。

检查点使 Flink 具有容错能力,并确保在发生故障时也能保证流应用程序的语义。检查点每隔固定的间隔来触发,该间隔可以在应用中配置。

Flink 中的 Kafka 消费者是一个有状态的算子(operator)并且集成了 Flink 的检查点机制,它的状态是所有 Kafka 分区的读取偏移量。当一个检查点被触发时,每一个分区的偏移量都保存到这个检查点中。Flink 的检查点机制保证了所有算子任务的存储状态都是一致的,即它们存储状态都是基于相同的输入数据。当所有的算子任务成功存储了它们的状态,一个检查点才成功完成。因此,当从潜在的系统故障中恢复时,系统提供了 Excatly-Once 的状态更新语义。

下面我们将一步步的介绍 Flink 如何对 Kafka 消费偏移量做检查点的。在本文的例子中,数据存储在 Flink 的 JobMaster 中。值得注意的是,在 POC 或生产用例下,这些数据通常是存储到一个外部文件系统(如HDFS或S3)中。

1. 第一步

如下实例,从包含两个分区的 Kafka Topic 中读取数据,每个分区都含有 ‘A’, ‘B’, ‘C’, ‘D’, ‘E’ 5条消息。我们将两个分区的偏移量都设置为0。

2. 第二步

第一步,Kafka 消费者开始从分区 0 读取消息。消息 ‘A’ 正在被处理,第一个消费者的偏移量变成了1。

3. 第三步

第三步,消息 ‘A’ 到达了 Flink Map Task。两个消费者都开始读取他们下一条消息(分区 0 读取 ‘B’,分区 1 读取 ‘A’)。两个分区各自将偏移量更新为 2 和 1 。同时,Flink 的 JobMaster 决定在 source 触发一个检查点。

4. 第四步

接下来,Kafka 消费者为它们的状态创建第一个快照(”offset = 2, 1”),并存储到 Flink 的 JobMaster 中。Source 在消息 ‘B’ 和 ‘A’ 后面发送一个 checkpoint barrier。Checkopint barrier 用于在所有算子任务之间对齐检查点,保证了整个检查点的一致性。消息 ‘A’ 到达了 Flink Map Task,而上面的消费者继续读取下一条消息(消息 ‘C’)。

5. 第五步

这一步中,Flink Map Task 接收到两个 Source 的 checkpoint barrier 后(对齐 barrier),那么就会将它自己的状态存储到 JobMaster。同时,消费者会继续从 Kafka 分区中读取更多消息。

6. 第六步

一旦 Flink Map Task 完成了状态快照后,会与 Flink JobMaster 进行通信(汇报已经完成了checkpoint)。当一个作业的所有的 Task 都确认完成状态快照后,JobMaster 就成功完成了这个 checkpoint。从此刻开始,这个 checkpoint 就可以用于故障恢复了。值得一提的是,Flink 并不依赖 Kafka 的偏移量从系统故障中恢复。

7. 故障恢复

在发生故障时(例如,某个 worker 崩溃),所有的算子任务都会被重启,而他们的状态会被重置到最近一次成功的 checkpoint。如下图所示:

Kafka Source 分别从偏移量 2 和 1 重新开始读取消息(因为这是最近一次成功的 checkpoint 中的偏移量)。当作业重启后,我们可以期待正常的系统操作,就好像之前没有发生故障一样。

备注:

  • 偏移量 Offset
  • 算子 operator
  • 分区 partition
  • 消费者 consumer

原文:How Apache Flink manages Kafka consumer offsets

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java3y

他怎么追个剧都能看出「大数据」来?

听说最近《长安十二时辰》比较火,于是趁着一个周末赶紧补一补剧。相信很多人都对其中的"大案牍术"比较感兴趣,靖安司说"大案牍术"选中了张小敬。

10320
来自专栏崔庆才的专栏

到底什么是数据中台?

最近可能大家听到“数据中台”这个词越来越频繁了,有时候我跟一些朋友聊起来,也是都在说这个,但是一直不知道这到底是个什么。最近就看到这篇文章,觉得说的还挺好的,分...

2K20
来自专栏JAVA葵花宝典

学会这几个Redis技巧,让你的程序快如闪电

实际上NewLife.Redis是一个完整的Redis协议功能的实现,但是Redis的核心功能并没有在这里面,而是在NewLife.Core里面。

6440
来自专栏休辞醉倒

HDFS查看文件内容

1.2K50
来自专栏Web技术布道师

终于有人把云计算、大数据和人工智能讲明白了!

今天跟大家讲讲云计算、大数据和人工智能。为什么讲这三个东西呢?因为这三个东西现在非常火,并且它们之间好像互相有关系:一般谈云计算的时候会提到大数据、谈人工智能的...

40730
来自专栏腾讯智能钛AI开发者

【产品新闻】2019可信云大会丨腾讯云AI平台专家产品经理余祖坤:AI建模平台的设计实践

7月2日,2019可信云大会在北京国际会议中心隆重开幕。2019可信云大会以“智能云网边,可信创未来”为主题,由中国信息通信研究院主办。

29070
来自专栏Jed的技术阶梯

001. Flink入门案例-WordCount实时处理

49020
来自专栏Jed的技术阶梯

003. Flink Local模式安装以及基于Local模式运行程序

因为服务器上的Flink安装目录下已经有了Flink的基础jar包,所以打包时应该把Flink的基础包的范围设置为provided,而在idea中直接运行代码的...

27920
来自专栏卯金刀GG

kettle使用命令行来运行ktr和kjb

1.ktr的运行:运行transformation文件是通过Pan.bat来运行的。

13820
来自专栏A周立SpringCloud

MySQL高性能优化规范建议,值得收藏

•所有数据库对象名称必须使用小写字母并用下划线分割•所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)•数...

12730

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励