我們知道Flink提供了容錯機制杰妓,能夠在應用失敗的時候重新恢復任務歪玲。這個機制主要就是通過持續(xù)產(chǎn)生快照的方式實現(xiàn)的。Flink快照主要包括兩部分數(shù)據(jù)一部分是數(shù)據(jù)流的數(shù)據(jù)币励,另一部分是operator的狀態(tài)數(shù)據(jù)吱殉。對應的快照機制的實現(xiàn)有主要兩個部分組成掸冤,一個是屏障(Barrier),一個是狀態(tài)(State)友雳。因為Flink這里處理的數(shù)據(jù)流稿湿,數(shù)據(jù)在多個operator的DAG拓撲中持續(xù)流動,要想實現(xiàn)某個時刻快照可以用于系統(tǒng)故障恢復押赊,必須保證這個快照饺藤,完全能夠確定某一個時刻狀態(tài),這個時刻之前的數(shù)據(jù)全部處理完流礁,之后的數(shù)據(jù)一個都沒有處理涕俗。這里就引入了屏障這個概念。這里我們主要介紹一下屏障實現(xiàn)神帅。
屏障 Barrier
Flink 分布式快照里面的一個核心的元素就是流屏障(stream barrier)再姑。這些屏障會被插入(injected)到數(shù)據(jù)流中,并作為數(shù)據(jù)流的一部分隨著數(shù)據(jù)流動找御。屏障并不會持有任何數(shù)據(jù)元镀,而是和數(shù)據(jù)一樣線性的流動绍填。可以看到屏障將數(shù)據(jù)流分成了兩部分數(shù)據(jù)(實際上是多個連續(xù)的部分)栖疑,一部分是當前快照的數(shù)據(jù)讨永,一部分下一個快照的數(shù)據(jù)。每個屏障會帶有它的快照ID遇革。這個快照的數(shù)據(jù)都在這個屏障的前面卿闹。從圖上看,數(shù)據(jù)是從左向右移動(右邊的先進入系統(tǒng))萝快,那么快照n包含的數(shù)據(jù)就是右側(cè)到下一個屏障(n-1)截止的數(shù)據(jù)比原,圖中兩個灰色豎線之間的部分,也就是part of checkpoint n杠巡。另外屏障并不會打斷數(shù)的流動,因而屏障是非常輕量的。在同一個時刻雇寇,多個快照可以在同一個數(shù)據(jù)流中氢拥,這也就是說多個快照可以同時產(chǎn)生。
如果是多個輸入數(shù)據(jù)流锨侯,多個數(shù)據(jù)流的屏障會被同時插入到數(shù)據(jù)流中嫩海。快照n的屏障被插入到數(shù)據(jù)流的點(我們稱之為Sn)囚痴,就是數(shù)據(jù)流中一直到的某個位置(包含了當前時刻之前時間的所有數(shù)據(jù))叁怪,也就是包含的這部分數(shù)據(jù)的快照。舉例來說深滚,在Kafka中奕谭,這個位置就是這個分區(qū)的最后一條記錄的offset。這個位置Sn就會上報給 checkpoint 的協(xié)調(diào)器(Flink的 JobManager)痴荐。
然后屏障開始向下流動血柳。當一個中間的operator收到它的所有輸入源的快照n屏障后,它就會向它所有的輸出流發(fā)射一個快照n的屏障生兆,一旦一個sink的operator收到所有輸入數(shù)據(jù)流的屏障n难捌,它就會向checkpoint的協(xié)調(diào)器發(fā)送快照n確認。當所有的sink都確認了快照n鸦难,系統(tǒng)才認為當前快照的數(shù)據(jù)已經(jīng)完成根吁。
一旦快照n已經(jīng)執(zhí)行完成,任務則不會再請求Sn之前的數(shù)據(jù)合蔽,因為此刻击敌,這些數(shù)據(jù)都已經(jīng)完全通過了數(shù)據(jù)流拓撲圖。
對齊機制
接收不止一個數(shù)據(jù)輸入的operator需要基于屏障對齊輸入數(shù)據(jù)流辈末。詳述如下:
整個流程圖如下所示
然后我們挨個看一下:
-
當operator接收到快照的屏障n后并不能直接處理之后的數(shù)據(jù)愚争,而是需要等待其他輸入快照的屏障n映皆。否則話,將會將快照n的數(shù)據(jù)和快照n+1的數(shù)據(jù)混在一起轰枝。圖中第一個所示捅彻,operator即將要收到數(shù)據(jù)流1(上面這個我們當成數(shù)據(jù)流1(6,5鞍陨,4步淹,3,2诚撵,1)缭裆,下面的當成數(shù)據(jù)流2好了)的屏障n,1寿烟,2澈驼,3在屏障n之后到達operator,這個時候如果數(shù)據(jù)流1的繼續(xù)處理筛武,那么operator中就會包含n屏障之后的數(shù)據(jù)(1缝其,2,3)徘六,但是operator中此刻在接收和處理數(shù)據(jù)流2内边,數(shù)據(jù)(a,b,c)就會和數(shù)據(jù)流1中的(1,2待锈,3)混合漠其。
image.png
- 快照n的數(shù)據(jù)流會被暫時放到一邊。從這些數(shù)據(jù)流中獲取到的數(shù)據(jù)不會被處理竿音,而是存儲到一個緩沖中和屎。圖中第一個所示,因為數(shù)據(jù)流2的屏障n還沒到春瞬,所以operator持續(xù)接收1眶俩,2,3然而并不做任何處理快鱼。但是需要將1颠印,2,3存入到buffer中抹竹。此時第二個數(shù)據(jù)流接到a线罕,b,則直接發(fā)送窃判,接到c發(fā)送c钞楼。
- 一旦最后一個數(shù)據(jù)流收到了快照n,opertor就會將發(fā)出所有阻塞的數(shù)據(jù)袄琳,并發(fā)出自己的屏障询件。如圖中第三個所示燃乍,operator最后收到了另一個數(shù)據(jù)流的屏障n,然后再發(fā)出a,b,c(圖中operator中的c,b,a)以后宛琅,發(fā)出自己的屏障刻蟹,這個時候buffer中又增加了一個4,變成(4嘿辟,3舆瘪,2,1)红伦。
- 之后operator會重新開始處理所有的輸入數(shù)據(jù)流英古,先處理buffer中的數(shù)據(jù),處理完之后再處理輸入數(shù)據(jù)流的數(shù)據(jù)昙读。如圖第四個所示召调,先將buffer中的1,2蛮浑,3某残,4先處理完,在接收并處理這兩個數(shù)據(jù)源的數(shù)據(jù)陵吸。
··=-·=···············