Apache Flink fault tolerance源码剖析完结篇

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
云原生网关 MSE Higress,422元/月
简介: 这篇文章是对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学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
相关文章
|
3月前
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
430 33
The Past, Present and Future of Apache Flink
|
5月前
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
1087 13
Apache Flink 2.0-preview released
|
5月前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
190 3
|
6月前
|
SQL 消息中间件 关系型数据库
Apache Doris Flink Connector 24.0.0 版本正式发布
该版本新增了对 Flink 1.20 的支持,并支持通过 Arrow Flight SQL 高速读取 Doris 中数据。
|
9天前
|
存储 大数据 数据处理
您有一份 Apache Flink 社区年度报告请查收~
您有一份 Apache Flink 社区年度报告请查收~
|
3月前
|
存储 SQL 人工智能
Apache Flink 2.0:Streaming into the Future
本文整理自阿里云智能高级技术专家宋辛童、资深技术专家梅源和高级技术专家李麟在 Flink Forward Asia 2024 主会场的分享。三位专家详细介绍了 Flink 2.0 的四大技术方向:Streaming、Stream-Batch Unification、Streaming Lakehouse 和 AI。主要内容包括 Flink 2.0 的存算分离云原生化、流批一体的 Materialized Table、Flink 与 Paimon 的深度集成,以及 Flink 在 AI 领域的应用。
677 13
Apache Flink 2.0:Streaming into the Future
|
6月前
|
消息中间件 资源调度 API
Apache Flink 流批融合技术介绍
本文源自阿里云高级研发工程师周云峰在Apache Asia Community OverCode 2024的分享,内容涵盖从“流批一体”到“流批融合”的演进、技术解决方案及社区进展。流批一体已在API、算子和引擎层面实现统一,但用户仍需手动配置作业模式。流批融合旨在通过动态调整优化策略,自动适应不同场景需求。文章详细介绍了如何通过量化指标(如isProcessingBacklog和isInsertOnly)实现这一目标,并展示了针对不同场景的具体优化措施。此外,还概述了社区当前进展及未来规划,包括将优化方案推向Flink社区、动态调整算子流程结构等。
505 31
Apache Flink 流批融合技术介绍
|
5月前
|
分布式计算 监控 大数据
大数据-148 Apache Kudu 从 Flink 下沉数据到 Kudu
大数据-148 Apache Kudu 从 Flink 下沉数据到 Kudu
133 1
|
5月前
|
数据挖掘 物联网 数据处理
深入探讨Apache Flink:实时数据流处理的强大框架
在数据驱动时代,企业需高效处理实时数据流。Apache Flink作为开源流处理框架,以其高性能和灵活性成为首选平台。本文详细介绍Flink的核心特性和应用场景,包括实时流处理、强大的状态管理、灵活的窗口机制及批处理兼容性。无论在实时数据分析、金融服务、物联网还是广告技术领域,Flink均展现出巨大潜力,是企业实时数据处理的理想选择。随着大数据需求增长,Flink将继续在数据处理领域发挥重要作用。
452 0
|
5月前
|
消息中间件 druid Kafka
从Apache Flink到Kafka再到Druid的实时数据传输,用于分析/决策
从Apache Flink到Kafka再到Druid的实时数据传输,用于分析/决策
127 0

推荐镜像

更多