Apache Flink fault tolerance源码剖析完结篇

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 这篇文章是对Flinkfault tolerance的一个总结。虽然还有些细节没有涉及到,但是基本的实现要点在这个系列中都已提及。 回顾这个系列,每篇文章都至少涉及一个知识点。我们来挨个总结一下。 恢复机制实现 Flink中通常需要进行状态恢复的对象是operator以及function。

这篇文章是对Flinkfault tolerance的一个总结。虽然还有些细节没有涉及到,但是基本的实现要点在这个系列中都已提及。

回顾这个系列,每篇文章都至少涉及一个知识点。我们来挨个总结一下。

恢复机制实现

Flink中通常需要进行状态恢复的对象是operator以及function。它们通过不同的方式来达到状态快照以及状态恢复的能力。其中function通过实现Checkpointed的接口,而operator通过实现StreamOpeator接口。这两个接口的行为是类似的。

当然对于数据源组件而言(SourceFunction),要想使得Flink具备完整的失败恢复能力,需要外部数据提供者具备重新消费数据的能力(Apache Kafka提供的message offset机制具备这样的能力,Flink的kafka-connector也利用了这一点来实现数据源的失败恢复,具体的实现见FlinkKafkaConsumerBase)。

检查点触发机制

检查点根据状态的不同,分为:

  • PendingCheckpoint:正在处理的检查点
  • CompletedCheckpoint:完成了的检查点

PendingCheckpoint表示一个检查点已经被创建,但还没有得到所有该应答的task的应答。一旦所有的task都给予应答,那么它将会被转化为一个CompletedCheckpoint

检查点的触发机制是基于时间的周期性触发。触发检查点的驱动者是JobManager,而检查点的执行者则是TaskManager

检查点的触发需要满足很多条件,比如需要所有的task都具备触发检查点的条件等等,检查点才能被触发执行,如果检查点定时任务在执行时遇到上一次正在执行的任务还没有完成,那么当前定时任务将先“入队”,等待上一次任务完成。

基于Akka消息驱动的协调机制

Flink运行时的控制中心是JobManager,检查点的触发由JobManager发起,真正的检查点的执行者为TaskManager。Flink的JobManager以及TaskManager之间利用Akka进行消息通信。因此,检查点的协调机制也基于Akka之上(通过消息来驱动),Flink定义了多个不同的消息对象来驱动检查点执行,比如DeclineCheckpointTriggerCheckpointAcknowledgeCheckpoint等。

基于Zookeeper的高可用

Flink提供了两种恢复模式RecoverMode

  • STANDALONE
  • ZOOKEEPER

STANDALONE表示不对JobManager的失败进行恢复。而ZOOKEEPER表示JobManager将基于Zookeeper实现HA(高可用)。

flink-fault-tolerance-3-overview

作为Flink高可用的实现机制,Zookeeper被用来生成原子的&单调递增的检查点ID,并存储已完成的检查点。

而检查点ID生成器以及已完成的检查点的存储合起来被称之为检查点恢复服务

保存点

所谓的保存点,其实是用户人为触发的一种特殊的检查点。其本质就是检查点,但它相比检查点有两点不同:

  • 用户自行触发
  • 当有新的已完成的检查点产生的时候,不会自动失效

flink-fault-tolerance-4_savepoint-and-checkpoint

保存点是用户人为触发的,如何触发呢?这依赖于Flink提供的client,用户可以通过client(CLI)来触发一个保存点。用户执行触发保存点操作后,client会通过akkaJobManager发一个消息,JobManager接着通知各TaskManager触发检查点。检查点触发完成后,TaskManager会执行JobManager的回调,在回调中JobManager会告知触发保存点的结果(也是通过akka给客户端发消息)。保存点它不会随着新的已完成的检查点产生而自动失效。另外,不同于检查点的是,保存点并不像检查点一样将状态作为自己的一部分一并保存。保存点不存储状态,它只通过一个指针指向具体的检查点所属的状态。

保存点的存储。Flink支持两种形式的保存点的存储:memoryfilesystem。推荐在生产环境下使用filesystem(可以利用hdfs等提供持久化保证)。因为基于memory的保存点存储机制是将保存点存储在JobManager的内存中。一旦JobManager宕机,那么保存点的信息将没有办法被恢复。

状态终端

在Flink中被直接支持的最终状态有:

  • ValueState : 单值状态
  • ListState : 集合状态
  • FoldingState : folding状态,for FoldFunction
  • ReducingState : reducing状态,for ReduceFunction

但最终结合检查点机制进行存储和恢复的状态表示是KvState,它表示通用的用户定义的键值对状态,可以简单得将其看做上面被最终支持的状态的容器。而KvStateSnapshot表示状态KvState的快照,用于对状态进行恢复。StateHandleoperator提供操作状态的接口,将状态从面向存储介质的原始表示还原为对象表示。

状态终端用来对状态进行持久化存储,Flink支持多个状态终端:

  • MemoryStateBackend
  • FsStateBackend
  • RocksDBStateBackend(第三方开发者实现)

基于Barrier机制的一致性保证

Flink提供两种不同的一致性保证:

  • EXACTLY_ONCE:恰巧一次
  • AT_LEAST_ONCE:至少一次

其中EXACTLY_ONCE支持对数据处理精确度要求较高的使用场景,但有时会产生明显的时延。而AT_LEAST_ONCE应对于需要低延时,但对数据的准确性要求并不高的场景。

需要注意的是这里的一致性保证并不是指被处理的元素流过Stream Dataflow的保证,而是指operator在最后一次改变状态之后,后续的数据对状态的改变产生的最终影响(结合检查点)。

一致性保证离不开Flink的checkpoint barrier

单个数据流视角,barrier示意:

flink-stream-fault-tolerance_stream-barriers

分布式多input channel视角,barrier示意图:

flink-stream-fault-tolerance_stream-aligning

该图演示的是多barrier aligning(对齐),但只有EXACTLY_ONCE一致性时才会要求这一点

JobManager将指示source发射barriers。当某个operator从其输入中接收到一个CheckpointBarrier,它将会意识到当前正处于前一个检查点和后一个检查点之间。一旦某operator从它的所有input channel中接收到checkpoint barrier。那么它将意识到该检查点已经完成了。它可以触发operator特殊的检查点行为并将该barrier广播给下游的operator

应对两种不同的一致性保证,Flink提供了两个不同的CheckpointBarrierHandler的实现,它们的对应关系是:

  • BarrierBuffer - EXACTLY_ONCE
  • BarrierTracker - AT_LEAST_ONCE

BarrierBuffer通过阻塞已接收到barrierinput channel并缓存被阻塞的channel中后续流入的数据流,直到所有的barrier都接收到或者不满足特定的检查点的条件后,才会释放这些被阻塞的channel,这个机制被称之为——aligning(对齐)。正是这种机制来实现EXACTLY_ONCE的一致性(它将检查点中的数据精准得隔离开)。

BarrierTrack的实现就要简单地多,它仅仅是对数据流中的barrier进行跟踪,但是数据流中的元素buffer是直接放行的。这种情况会导致同一个检查点中可能会预先混入后续检查点的元素,从而只能提供AT_LEAST_ONCE的一致性。

完整的检查点流程示例

flink-fault-tolerance-7_checkpoint-1

flink-fault-tolerance-7_checkpoint-2

flink-fault-tolerance-7_checkpoint-3

flink-fault-tolerance-7_checkpoint-4

小结

本文是Flink fault tolerance系列的完结篇,对关键概念和流程进行了总结和梳理。


原文发布时间为:2016-06-19

本文作者:vinoYang

本文来自云栖社区合作伙伴CSDN博客,了解相关信息可以关注CSDN博客。

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
相关文章
|
29天前
|
存储 缓存 负载均衡
【Apache ShenYu源码】如何实现负载均衡模块设计
整个模块为ShenYu提供了什么功能。我们可以看下上文我们提到的工厂对象。/***/核心方法很清晰,我们传入Upsteam列表,通过这个模块的负载均衡算法,负载均衡地返回其中一个对象。这也就是这个模块提供的功能。
17 1
|
30天前
|
消息中间件 API Apache
官宣|阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会
本文整理自阿里云开源大数据平台徐榜江 (雪尽),关于阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会。
1400 1
官宣|阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会
|
1月前
|
Java API Apache
【Apache ShenYu源码】看看贡献者如何实现支持提醒通知设计
在阅读中,还发现了有个html文件忘记加了开源协议,我们提下PR修复下,又收获了一次开源贡献!!PR提交戳这。
22 1
【Apache ShenYu源码】看看贡献者如何实现支持提醒通知设计
|
1月前
|
SQL Java API
官宣|Apache Flink 1.19 发布公告
Apache Flink PMC(项目管理委员)很高兴地宣布发布 Apache Flink 1.19.0。
1313 1
官宣|Apache Flink 1.19 发布公告
|
1月前
|
SQL Apache 流计算
Apache Flink官方网站提供了关于如何使用Docker进行Flink CDC测试的文档
【2月更文挑战第25天】Apache Flink官方网站提供了关于如何使用Docker进行Flink CDC测试的文档
141 3
|
1月前
|
Oracle 关系型数据库 流计算
flink cdc 同步问题之报错org.apache.flink.util.SerializedThrowable:如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
|
1月前
|
XML Java Apache
Apache Flink自定义 logback xml配置
Apache Flink自定义 logback xml配置
145 0
|
1月前
|
消息中间件 Java Kafka
Apache Hudi + Flink作业运行指南
Apache Hudi + Flink作业运行指南
81 1
|
1月前
|
缓存 分布式计算 Apache
Apache Hudi与Apache Flink更好地集成,最新方案了解下?
Apache Hudi与Apache Flink更好地集成,最新方案了解下?
59 0
|
1月前
|
监控 Apache 开发工具
Apache Flink 1.12.2集成Hudi 0.9.0运行指南
Apache Flink 1.12.2集成Hudi 0.9.0运行指南
65 0

热门文章

最新文章

推荐镜像

更多