数据流容错

数据流容错
此文档描述Flink的数据流容错机制。
介绍
Flink提供失败容错机制能始终恢复数据流的状态。这机制可以确保即使出现失败,应用的状态也可以实现完全一次的数据流记录处理。
注意,还有一个开关可以将保护降级到至少一次。(介绍在下面)

容错机制不断的为分布式数据流生成快照。对于状态规模小的流处理程序,快照是非常轻量的,可以频繁生成并不会影响程序处理性能。
数据流程序的状态被保存在一个可配置的位置。(例如mastre节点或HDFS).

当发生程序错误(机器、网络或软件错误),flink停止分布式数据流。系统重启算子并重置到最后成功的检查点。输入数据流重置到快照状态中的位置。
并行数据流重启后所有执行过的数据记录,确保不会加入到重启前的保存点。
注意:默认,检查点机制是关闭的。查看检查点章节了解如何打开和配置检查点机制。

注意:要实现完整的保障机制,数据流的源算子(例如消息队列或代理)需要能实现重置数据流到一个明确的回退点。Kafka具有这个能力,并且
flink的kafka连接器使用了这个能力。查看数据源和数据输出的容错保障一章,更多关于flink连接器提供的保障。
注意:由于flink的检查点通过分布式快照实现,快照和检查点代表同一个意思。

检查点
flink容错机制核心的部分即使生成一致性快照,快照包含分布式数据流和算子状态。
这些快照作为一致性检查点,用来将系统从错误中还原。flink生成快照的机制的介绍“分布式数据流的轻量异步快照”。
它基于标准的Chandy-Lamport algorithm算法处理分布式快照,并且为flink的执行模型定制。

栅栏
flink分布式快照的核心元素是数据流栅栏。这些栅栏被插入数据流,并且随着数据记录成为数据流的一部分。
栅栏不会越过记录,流严格的按线性顺序前进。栅栏将数据流中的数据记录分隔成集合进入当前快照,其它进入下一个快照。每个栅栏携带
快照id,代表栅栏前的记录被推入这个快照。栅栏不打断数据流并且十分轻量。数据流中可以同时存在不同快照对应的多个栅栏,这表明不同的快照可能同步执行。

栅栏在数据源上被注入并行的数据流。快照n上注入栅栏的位置(叫做sn),表示数据源流上快照覆盖到哪些数据。例如,kafka,这个位置就是分区上最后一条数据记录的偏移。
sn的位置被上报给检查点coordinator(flink的JobManager上)

栅栏顺流向下。当中间的算子收到全部输入节点传递的快照栅栏后,它发送快照n的栅栏到全部的输出流。当输出算子收到所有输入流的栅栏n后,它回复快照n给检查点coordinator。
当全部输出节点回复快照,快照完成。
当快照n完成,任务不需要数据源发送sn之前的记录,意味着这个位置之前的记录(和他们之前的记录)已经走过了整个数据流。
算子存在多个输入流时需要对齐输入流的快照栅栏。上图进行了说明:
算子从一个输入流收到栅栏n后,不能继续处理这个输入流后续的记录,直到它收到全部输入流的快照n的栅栏。否则,快照n和快照n+1的记录会被混合。
收到栅栏n的数据流会临时放在一边。从这些数据流收到的记录不会进行处理,而是放到输入缓存中。
当最后的输入流收到栅栏n时,算子发送全部的等待输出消息。并且发送快照n的栅栏。
最后,恢复处理所有输入流的记录,先处理输入缓存,然后再处理数据流输出记录。

状态
当算子包含任意形式的状态,状态同样需要保存在快照中。算子状态包含多种形式:
用户定义状态:这种状态在转换函数中创建和修改(例如map()或filter()).查看数据流程序中的状态一节。
系统状态:这种状态指的是算子内部计算使用的数据缓存。一个典型的例子是窗口缓存,窗口状态收集(和聚合)记录,直到窗口执行和驱逐。

算子收到全部输入流的快照栅栏后先快照状态,然后向输出流发送栅栏。此时,栅栏之前的记录已经完成对状态的操作,并且没有栅栏之后的记录更新状态。
由于快照的状态规模很大,它保存在可配置的状态后端。默认存储在JobManager内存中,但生产环境下应该配置一个分布式高可靠性的存储。(例如HDFS)
状态存储后,算子给检查点回应答消息,发送快照栅栏到输出流,继续执行。

生成的快照包括:
每个并行数据源,快照对应数据流的起始位置。
每个算子,指向保存状态快照的指针。

精确一次 对比 至少一次
对齐操作会导致数据处理延迟。通常,额外的延迟规律性持续几毫秒,但也存在非常明显的延迟异常增加的情况。
当需要程序所有记录都必须超低延迟(几毫秒),flink可以切换到在检查点时跳过对齐。算子收到每个输入的栅栏立即执行检查点快照生成。
当跳过了对齐,甚至在收到检查点n的栅栏之后,算子仍继续处理输入记录。
这样的话,算子在检查点n完成之前,处理了属于检查点n+1的记录。如果重启恢复检查点n任务,这些记录会被重复执行,因为它们已经包括在检查点n的状态快照里,
并且还会作为检查点n之后的记录重新执行。
注意:对齐只发生在算子存在多个输入和算子带多个发送方(在数据流重新分配和洗牌后)。因此,尴尬q情况是只存在并行流操作(map()、flatMap()、filter())的数据流,在至少一次的模式下,效果与
精确一次是一样的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值