分布式环境下的流式处理平台相对于批处理平台而言,一个非常重要的问题是如何保证分布式计算节点在发生故障并恢复后最终的计算结果是正确的。在批处理的模式下,数据有界,在任务开始前我们就可以得到需要计算的所有数据,如果节点出错,最坏的情况下只需要对数据集进行重新计算,但在流式处理模式下,数据是源源不断产生并且无界的,节点故障恢复后无法从头开始重新计算。
分布式快照
在网络服务中,快照是比较常用的一个容错机制,比如Redis中就有基于RDB进行数据恢复的策略,flink的快速容错机制也是基于快照的方式实现的。在单机环境下,保存快照比较简单,只需要在某个时间点暂停任务处理并将当前状态持久化即可,但在分布式系统中,由于没有一个全局时钟,想要同时对所有计算节点的状态进行保存是很难做到的(要详细了解可以参考附录:分布式系统中的时钟)。最简单的实现方式是通过类似2PC的方式将所有节点任务都停止并进行状态保存,最后统一上报,但这这种stop the world的方式会极大的增加计算延时和降低吞吐量。flink最终的解决方案是基于Chandy-Lamport算法改进而来的Asynchronous Barrier Snapshotting(异步屏障快照)算法
Chandy-Lamport
chandy-lamport算法的核心思想是将分布式系统抽象为一个有向图,每个分布式节点作为顶点,节点与节点之间的通信信道被抽象为图的有向边(input channel,output channel),在发起快照时,每个节点会记录自身状态和input channel的状态,最终可以得到一个全局一致的快照,下面用一个例子详细解释。
如下图所示,一个分布式系统中有两个节点P1和P2,两个节点分别有X,Y,Z三个状态,通过C12和C21两个信道可以互相发送消息
首先P1发起了一个快照操作(同时可以上报到一个全局的快照协调系统),他会先保存自身状态[X1:0,Y1:0,Z1:0],并向下游发送一个特殊消息marker,用于通知下游节点也进行快照操作,与此同时,P2通过C21向P1发送了一条业务消息
此时由于P1已经完成了快照,在P2节点未完成快照之前不可以进行消息处理,否则最后生成的全局快照会不一致,此时需要将它的输入信道C21中的所有消息(目前只有M1)也追加到快照中,与此同时P2接收到了P1过来的marker信息,同样进行了快照操作
最后P1接收到来自P2的marker信息,此时两个节点快照都保存完毕(同样可以上报到一个全局的快照协调系统,告知快照操作结束),可以认为全局快照生成成功
可以看到整体的算法还是比较简单易懂的,但要注意的是,此算法要求网络的传输是有序的,可靠的(很容易就会想到TCP协议),需要严格保证消息和marker是按发送顺序到达其他节点。
Asynchronous Barrier Snapshotting
Chandy-Lamport虽然理解起来不复杂,但存在两个比较大的问题。1是在进行快照时节点不仅需要保存自身状态,还要保存所有input channer中的消息,这会导致快照体积比较大,并且基于快照进行恢复时效率低,2是整个系统的运行效率取决于最慢的计算节点。flink基于Chandy-Lamport算法进行了改进,它的核心思想如下
每当需要生成全局快照时,流的source在产生的消息是插入一个带ID的特殊信息,称之为barrier(屏障),同时source会向快照协调者上报快照生成操作已启动,并记录自身offset(用于故障回复之后流的重放),这些屏障会将整个数据流切分为不同的数据集,当下游的处理节点处理到屏障时会在本地保存一份快照,并向更下游广播带有相同ID的屏障,最终当sink(流的输出端)也处理到屏障时,向协调者上报快照生成成功,还是以一个例子进行说明
如图所示,上游节点的快照已保存成功并且向图中的task节点输出了两个数据流,由于数据流1的处理速度较快,它的屏障N先到达了图中的task处,此时节点需要暂时停止处理数据流1的消息并将消息保存在本地缓冲中,等到数据流2的屏障N也到达task时,task会先保存本地状态(快照)同时向下游广播屏障N,这个操作被称之为屏障的对齐,最终sink(输出)也进行屏障对齐之后,会向快照协调者上报全局快照生成成功,此时整个分布式系统,包括图中的task节点和上游的节点保存的快照是一致的,即只包含对于屏障N之前的消息的处理状态,如果发生故障,各节点快照中读取状态,同时source屏障N的Offset处进行消息回放即可
Asynchronous Barrier Snapshotting算法解决了需要保存额外消息的问题,但和Chandy-Lamport算法一样,会导致整个分布式系统的计算效率受限于整个系统中最慢的节点(需要进行屏障对齐),所以Blink/Flink支持关闭屏障对齐,在这种模式下,如果数据流1的屏障先到达,task还是会继续处理数据流1的后续数据,只是在数据流2的屏障到达时,会将两个时间段内处理的消息一起保存在快照中。在Blink中,快照被称为Check Point
Flink中的时间和窗口
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。
分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
QL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**