这篇文档描述了Flink的流式计算的容错机制

简介

Flink提供容错机制来对应用数据流提供持续的恢复。这个机制保证了即使在出现错误的情况下,记录也只会被处理一次。注意,这里有一个开关来降级担保至少处理一次(接下来会详细介绍)。

容错机制会持续不断地对分布式数据流画快照。对于一些小状态的流式应用来说,这些快照是很轻量级的,不会非性能造成太大影响。这些流式应用的状态都被保存在一个可配置的地方(如master node或HDFS)

一旦程序出错(可能是机器故障,网络故障,或者一些软件缺陷),Flink会停止这些分布式的数据流。系统会重启它们并重置到最近的一次正常的检查点。输入流会重置到快照点。任何重启后数据流的已经被处理的记录会被确保不会回到之前的检查点状态,也就是说不会再重新去走一遍已经走过的路。

注意:为充分发挥这个机制的保障,数据源(如消息队列或broker)需要支持能够将数据流倒回到一个已定义最近的点,Apache Kafka支持这样,Flink和Kafka连接会充分发挥其能力。

注意:因为Flink的检查点是通过分布式快照来实现的,我们使用字符快照和可交换的检查点

检查点

Flink容错机制最核心的部分就是对分布式流和operater的状态持续不断地画快照。这些快照作为持续不断的检查点来保证一旦程序出现问题后可以回滚。画快照的机制在“Lightweight Asynchronous Snapshots for Distributed Dataflows”里有介绍。它的灵感来自于分布式快照的Chandy-Lamport算法,并且是转为Flink设计的执行模型

Barriers

Flink分布式快照里的核心元素是brarriers。这些brarris被注入到数据流中成为数据流的一部分。brarris不会超越前面的数据,它们严格线性流动。brarrier 将一个数据流中的记录分离到即将进入目前的一个快照、下一个快照里面去的集合。也就是说brarrier将数据流划分为多个段,每一段去不同的快照。每一个brarrier都带有一个它前面数据即将去的那个快照的ID。Barriers不会中断数据流并且都是非常的轻量级。属于多个快照的多个barriers能够在同一时刻子啊同一个留里面出现,这意味着多个快照可能同步发生。

barriers在数据源端被注入到并行的数据流中。快照n(记为Sn)对应的barriers被注入的位置与该快照所覆盖的数据区域有关。比如说,在Kafka中,这个位置就是在分区中的最后一条数据的偏移。Sn这个位置会传递给检查点的coordinator(Flink job 管理器)。

接下来barriers会继续往下流。当一个中间位置的operator从它所有的输入流中接收到快照n的barrier,它会将这个barrier发送到它输出的所有流里面。当一个sink operator(也就是DAG的终点)从它的所有输入流中接收到barrier n,它会将快照n上报到coordinator。当所有的sink 组件都对快照n进行确认之后,就可以被认为处理完毕了。

当快照n被处理完毕的时候,可以确定的是快照n之前的记录都已经被处理完毕了。因为这些记录(以及它们后面的记录)都已经流经了整个拓扑。

有多个输入流的operater需要根据快照将各个流对齐。以下是对上图的解释:

  • 一旦operator从任何一个流里面接收到快照n的barrier,在全部接收其它流中快照n的barrier之前,此operator就不再接收这条流里面的任何记录。然而,这些已经接收的记录可能将快照n的记录和快照n+1的记录混杂了(因为来的时候的数据不能保证按序到达)。
  • Streams that report barrier n被暂时搁置。从这些流里面接收到的数据暂时不回被处理,而是先存放到缓冲区。
  • 一旦从最后一条输流里面接收到barrier n,opertor发出所有正在等待发出的记录,然后发出快照n的barrier.
  • 从这以后,恢复从流里面读取记录,在从流里面读取数据之前,得先读完缓冲区里面的记录。

State

operators可能包含各种形式的State,这些state同样也会成为快照的一部分。operator的state来自以下几种形式:

  • 用户自定义state:这是直接由transformation方法(就像 map()或者filter())来创建和修改的一种state。自定义的state可以是一个简单变量,也可以是与function关联的key/value状态(详情参考State in Streaming Applications
  • 系统state:这种状态是用在部分在operator计算缓冲区里面的缓冲数据。一个典型的例子就是窗口缓冲,在这种状态中,系统会不断给窗口收集(或聚合)记录,直到这个窗口被处理成功后发送。.

operators会在收到所有输入流的barrier后及时地对他们的状态进行快照,然后再将barriers发送到输入流。在这个时刻,barriers之前的记录对state的更新都已经被记录,在barriers之后的记录会对state造成的更新都不会被应用。因为一个快照的状态可能是比较大的,它被存储在一个可配置的后端state里。默认情况下,这部分使用的是jobManager的内存,但是在重要的设置步骤中,应该配置一个值得信赖的存储系统(比如HDFS)。state被存储之后,operator会对快照进行确认,将快照的barrier发送到输出流,然后继续处理。

刚生成的快照现在包含:

  • 对每一个数据流,在该数据流中该快照的起始位置
  • 对每一个opertor,有一个指向作为该快照一部分的state的指针

一次处理语义和至少一次性语义

数据流对齐的步骤可能会对程序增加延时。通常情况下,因为这个导致的延时控制在几毫秒之内,但是在某些存在不正常数据的情况下我们发现延时增加明显。对于应用程序来说通常希望对所有记录保持保持低延迟(几毫秒),Flink有一个开关来跳过流对齐的步骤,检查点的快照机制依然会保持运行。在收到所有流的barrier后对检查点进行快照。

在对齐步骤跳过后,operator保持对各输入流的处理,即便是在只有某些流的barrier到达,依然对这些流继续处理,不搁置(以前会搁置直到所有流对快照 n 的barrier都到达这个operator)。在一次恢复之后,这些记录可能会重复出现,因为它们都被包含在快照n里面,会在快照n之后重现

注意:对齐步骤只应该在需要jion操作以及多个发出流(在流被重新分区或shuffle之后)的情况下才需要启用。因为那些只有一些简单并行流操作(如 map(),flatMap(),filter(),...)的流事实上就已经提供了至少处理一次语义。

恢复

恢复机制是很简单直接的:在一次错误发生的时候,Flink选取最近的一次成功的检查点 k。然后系统重现在这个快照中的整个分布式流,并提供每个operator在此快照中的检查点 k 时的状态。数据源被设置为从Sk位置开始读取。比如在Kafka中,意思就是被告知从偏移为Sk的地方开始消费。

如果快照被不正确地记录,operator会从最近一次正确的快照开始,将接下来的快照增量更新到此state

<译>流计算容错的更多相关文章

  1. 大数据开发实战:Spark Streaming流计算开发

    1.背景介绍 Storm以及离线数据平台的MapReduce和Hive构成了Hadoop生态对实时和离线数据处理的一套完整处理解决方案.除了此套解决方案之外,还有一种非常流行的而且完整的离线和 实时数 ...

  2. .Spark Streaming(上)--实时流计算Spark Streaming原理介

    Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍 http://www.cnblogs.com/shishanyuan/p/474 ...

  3. Storm概念学习系列之什么是实时流计算?

    不多说,直接上干货! 什么是实时流计算?    1.实时流计算背景 2.实时计算应用场景 3.实时计算处理流程 4.实时计算框架 什么是实时流计算? 所谓实时流计算,就是近几年由于数据得到广泛应用之后 ...

  4. 用Spark进行实时流计算

    Spark Streaming VS Structured Streaming Spark Streaming是Spark最初的流处理框架,使用了微批的形式来进行流处理. 提供了基于RDDs的Dstr ...

  5. 《Kafka Stream》调研:一种轻量级流计算模式

    原文链接:https://yq.aliyun.com/articles/58382 摘要: 流计算,已经有Storm.Spark,Samza,包括最近新起的Flink,Kafka为什么再自己做一套流计 ...

  6. Storm分布式实时流计算框架相关技术总结

    Storm分布式实时流计算框架相关技术总结 Storm作为一个开源的分布式实时流计算框架,其内部实现使用了一些常用的技术,这里是对这些技术及其在Storm中作用的概括介绍.以此为基础,后续再深入了解S ...

  7. 使用Python的yield实现流计算模式

    首先先提一下上一篇<如何猜出Y combinator>中用的方法太复杂了.其实在Lambda演算中实现递归的思想很简单,就是函数把自己作为第一个参数传入函数,然后后面就是简单的Lambda ...

  8. Storm流计算之项目篇(Storm+Kafka+HBase+Highcharts+JQuery,含3个完整实际项目)

    1.1.课程的背景 Storm是什么? 为什么学习Storm? Storm是Twitter开源的分布式实时大数据处理框架,被业界称为实时版Hadoop. 随着越来越多的场景对Hadoop的MapRed ...

  9. Dream_Spark-----Spark 定制版:005~贯通Spark Streaming流计算框架的运行源码

    Spark 定制版:005~贯通Spark Streaming流计算框架的运行源码   本讲内容: a. 在线动态计算分类最热门商品案例回顾与演示 b. 基于案例贯通Spark Streaming的运 ...

随机推荐

  1. android studio安卓工作室 工具栏

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha android studio安卓工作室 工具栏  都有什么 . 打开.保存全部.刷新.撤 ...

  2. [BZOJ2007][NOI2010]海拔(对偶图最短路)

    首先确定所有点的海拔非0即1,问题转化成裸的平面图最小割问题,进而转化成对偶图最短路(同BZOJ1002). 这题的边是有向的,所以所有边顺时针旋转90度即可. 如下图(S和T的位置是反的). #in ...

  3. POJ 2425 A Chess Game 博弈论 sg函数

    http://poj.org/problem?id=2425 典型的sg函数,建图搜sg函数预处理之后直接求每次游戏的异或和.仍然是因为看不懂题目卡了好久. 这道题大概有两个坑, 1.是搜索的时候vi ...

  4. CodeForces - 1000E We Need More Bosses

    题面在这里! 依然一眼题,求出割边之后把图缩成一棵树,然后直接求最长链就行了2333 #include<bits/stdc++.h> #define ll long long using ...

  5. 【Trie】【kd-tree】计蒜客17122 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 I. Barty's Computer

    题意:2种操作:①往集合里添加一个串 ②给你四个小串a b c d,问你集合里有几个串S满足S=a+S1+b+c+S2+d的形式.S1 S2可以为空,并且a+S1+b=c+S2+d. 就搞四颗Trie ...

  6. Problem C: 零起点学算法82——数组中查找数

    #include<stdio.h> int main(void) { ],m; while(scanf("%d",&n)!=EOF) { ;i<n;i++ ...

  7. [NOIP2011]聪明的质检员

    [问题描述] 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有$n$个矿石,从 1 到$n$逐一编号,每个矿石都有自己的重量$w_i$以及价值$v_i$.检验矿产的流程是: 1. 给 ...

  8. kindeditor在Firefoxt 和 Chrome 下不能取到值的解决方法

    默认form模式提交数据的时候,在ie下用户不需要进行任何设置和调用sync函数,因为editor已经自动调用,但是在firefox和 chrome下,用户如果不手动调用sync函数,editor的数 ...

  9. 怎么查看和修改 MySQL 的最大连接数

    通常,mysql的最大连接数默认是100, 最大可以达到16384.1.查看最大连接数:show variables like '%max_connections%';2.修改最大连接数方法一:修改配 ...

  10. 统计中的t检验

    1.什么情况下,应用t检验 1. 已知总体的均值m,或者我们假设了一个总体均值m: 2. 我们知道样本的个数n,样本的的方差var,样本的均值m: 3. 我们假设总体,或者样本都是服从正太分布的. 2 ...