Stream Processing:Apache Flink快照(snapshot)原理
本文将要讲解的是Apache Flink分布式流处理的轻量异步的快照原理。网上已经有几篇相关的博文,而本文的不同之处在于,它不是论文的纯粹翻译(论文地址),而是用自己的语言结合自己的理解对其原理的阐述。
本文将同下面几个方面讲解:
- 什么是快照?为什么需要快照?
- 跟其他系统的快照相比,Apache Flink快照的原理有哪些优点?
- Apache Flink的快照原理是什么?
1. 什么是快照?为什么需要快照?
快照,英文名字叫snapshot,是指对系统当前运行状态的存储,以便在系统故障宕机的时候恢复之前某一个时间点的状态信息,从而继续执行。快照是系统实现可用性的必要功能,是分布式系统实现容错性的常规方法。
一般将快照保存在本机硬盘上,或者暂时其他机器的内存或者直接存储在其他机器硬盘上面。对于暂时存储在其他机器的内存上面的情况,应当以批量的方式定时将内存中的快照刷的硬盘中,实现持久化。批量的方式的优点是减少硬盘的访问量,缺点是有很小的丢失快照的可能性。
2. 跟其他系统的快照相比,Apache Flink快照的原理有哪些优点?
这里我们将对比Apache Spark、Apache Hadoop和Apache Flink三个系统的快照功能。
下面是Spark的算子运算图,该图是有向无环的。数据从左边输入(A和C),最终以G为结束点。我们知道Spark采用批处理的方式来处理大数据,批处理区别于流处理。在Spark中,通过上游节点重新计算来恢复在宕机之前的数据。比如,如果B宕机了,那么重新计算A生成输入B的数据。这样做的优点是不需要存储算子的当前的状态信息,节省空间。缺点是增加了计算量以及计算所需要的时间。
Apache Hadoop,这里具体指HDFS,它采用的是备份数据到不同的(机架)机器硬盘上面来实现。默认为复制三分。优点是干脆利落,能够同时支持HDFS作为存储系统的时候的数据容错备份,也可以作为Mapreduce计算的中间结果的容错备份。缺点是在速度方面有点慢。
Apache Flink采用了上面两种不同的快照功能。其优点是异步的(即使是单机)轻量级的,所需要存储的快照信息也相对较少。
3. Apache Flink的快照原理是什么?
Flink的快照功能针对两种计算网络分别阐述,第一种是有向无环计算网络,第二种是有向有环的计算网络。
下面第一张图是有向无环的计算网络,一个节点的计算结果没有出现返回倒流的情况。图中的表示分别表示为:
圆圈表示流中的数据,黄圈和紫圈表示屏障发送之前的数据,他们分别来自两个不同的数据源,白圈表示屏障发送之后的数据。图中的数据之间的黑色线段表示一个屏障。屏障也没有什么特别的地方,它只是流中有着特殊标志的数据。图中箭头表示一个数据流,红色箭头表示暂时停止接收该流中的数据(停止接收不等于丢弃)。
现在系统要生成一个快照,
- 首先在所有的数据源注入屏障数据,然后向所有的输出节点广播屏障数据
- 如果一个非数据源的节点收到屏障,就阻塞该屏障所在的输入流,也就是暂时不接受这一个输入流的数据,直到接收到其他输入流的所有屏障。所以,如果该节点只有一个输入流,不用阻塞等待。
- 当这个节点接收到了跟其连接的输入流的所有屏障,便开始生成一个当前节点的一个快照。
分析:
- 可中断性分析:因为它是有向无环图,所以只要节点没有宕掉,屏障肯定能够被每一个节点接收到,然后生成一个快照。
- 可行性分析:整个数据的处理过程满足先进先出的原则,所以,在屏障前面的数据和状态都为历史状态,不存在后到的数据先于屏障被处理。也就是上图中白圈的数据总是后于屏障被处理。
下面这张图表示有向有环图,相比于上面的图片,多了环。
如果要生成一个快照,同样地,
1 首先向每一个数据源发送屏障,
2 如果节点有多条输入流,在接收到某一条流的屏障之后需要暂时停止对该流的接收,直到接收到该节点所有输入流中的屏障。
3 对于某一个有倒向输入流的节点,记录下每一个倒向流动的数据,直到收到一个倒向的屏障(比如下图图c)。收到倒向的屏障之后,生成当前快照。
当前快照的内容包括当前节点的运行状态信息(这个跟有向无环图一样),还包含所有所记录的倒向的数据。在下图中,倒向的数据是被长方形圈住的三个红点。
这种情况下的可中断性和可行性跟上面差不多。对于倒向流的可中断性也容易理解,因为一个有倒向流的节点总能收到一个倒向的屏障数据。
整个快照生成的过程基本上都是异步的,除了在本节点的其他输入流的屏障到来之前需要同步等待。
对于快照的存储,对于有向无环图,只需要保存每一个计算节点的状态信息,对于有向有环图,需要保存节点的状态信息以及倒向的数据信息。两者都不需要保存其他流管道中的数据。所谓的状态信息,举一个例子,一个节点运行count统计计算,那么它的状态信息就是一个int或者long类型的变量。
对于快照的恢复,需要考虑一些问题,比如重复的数据应避免重复计算。这个本文不重点讲解,可以参考论文 Pietzuch. Making state explicit for imperative big data processing.
谢谢
Stream Processing:Apache Flink快照(snapshot)原理相关推荐
- Linux 快照 (snapshot) 原理与实践(二) 快照功能实践
文章目录 0. 概要 1. 准备演示数据 2. 创建 snapshot-origin 目标 3. 创建 snapshot 目标 4. 验证 COW 操作 4.1 第一次写数据 4.2 第二次写数据 5 ...
- Linux 快照 (snapshot) 原理与实践(一) 快照基本原理
文章目录 0. 背景 1. 如何理解快照(snapshot)? 2. 快照 (snapshot) 的原理 2.1 全量快照 1. 克隆 (Clone) 2. 镜像分离 (Split Mirror) 2 ...
- Stream Processing: Apache Kafka的Exactly-once的定义 原理和实现
2018年,Apache Kafka以一种特殊的设计和方法实现了强语义的exactly-once和事务性.热泪盈眶啊! 这篇文章将讲解kafka中exactly-once和事务操作的原理,具体为 (1 ...
- Apache Flink介绍、架构、原理以及实现
文章目录 一 Flink简介 1.1 什么是flink 1.2 flink的特点 1.3 编程API 二 Flink架构 2.1 架构图 2.2 运行组件 2.3 关键词含义 三 Flink原理 3. ...
- flink 本地_Flink原理Apache Flink漫谈系列 State
实际问题 在流计算场景中,数据会源源不断的流入Apache Flink系统,每条数据进入Apache Flink系统都会触发计算.如果我们想进行一个Count聚合计算,那么每次触发计算是将历史上所有流 ...
- bilibili Saber 实时计算平台架构与实践【Apache Flink 替换 Spark Stream的架构与实践】
摘要:本文由 bilibili 大数据实时平台负责人郑志升分享,基于对 bilibili 实时计算的痛点分析,详细介绍了 bilibili Saber 实时计算平台架构与实践.本次分享主要围绕以下四个 ...
- 【Flink】IncompatibleClassChangeError: Found class org.apache.flink.streaming.runtime.tasks.Processing
1.背景 测试Flink CEP,然后使用ProcessTime,然后报错如下 org.apache.flink.runt ime.client.JobExecut ionException: Job ...
- Apache Flink 零基础入门(一):基础概念解析
Apache Flink 的定义.架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行 ...
- Flink前世今生和原理
目录 1. 基本概念 Why-分布式计算发展史 MapReduce Spark Flink 总结 What-什么是Flink Where-Flink应用场景 2. 原理 什么是流? Dataflow模 ...
最新文章
- 分享Leangoo敏捷工具操作视频
- formal method revision
- php 枚举cookie内容,php如何修改cookie内容?
- Opportunity的chance of success的赋值逻辑
- codeforces855 C. Helga Hufflepuff‘s Cup(树形dp)
- java设计模式-简单工厂模式
- to_date , to_char
- synchronized 底层了解一下...
- fadein和fadeto_jQuery fadeIn,fadeOut,fadeTo
- Atitit 艾提拉总结的操作硬件解决方案 目录 1.1. Atitit 列出wifi热点以及连接	1 1.2. 剪贴板	1 1.3. 屏幕 触摸与截屏	1 1.4. 性能 cpu 内存 硬盘 资源
- WPF-21:WPF实现仿安卓的图案密码键盘(改进)
- Qimage像素级操作
- Golang环境及revel框架在Linux下的安装
- 大数据云计算支撑公安工作跨越发展
- Java实现网络通信(TCP程序设计)
- web项目034-----JS模版引擎
- vue在vscode代码格式化
- ANSYS FLUENT 超临界流体物性分段线性插值数据批量导入
- Kubernetes Kubelete 报错 ctr: failed to create shim task: OCI runtime create failed
- 组件‘mscomctl.ocx‘或它的一个依赖项没有正确注册:一个文件丢失或无效
热门文章
- linux下mysql日志配置_Linux下MySQL 5.5.21 服务器日志配置
- python批量删除特定字符_根据某个特定字符删除一行
- python抽奖游戏_python实现转盘效果 python实现轮盘抽奖游戏
- UART接口算法移植加密芯片的调试技巧——通讯调试
- 96.6. Template
- OpenStack Newton发布,EasyStack核心代码贡献中国第一!
- java.lang.OutOfMemoryError: Java heap space的解决办法
- 祝天下所有的老师教师节快乐
- bst latex 最大作者数_latex bst文件怎么用
- 分子偶极矩大小如何判断_润滑油粘度大小该如何判断你知道吗?