對于具有輕微狀態(tài)的Streaming應用,會生成非常輕量的Snapshot而且非常頻繁,但并不會影響數(shù)據(jù)流處理性能。Streaming應用的狀態(tài)會被存儲到一個可配置的存儲系統(tǒng)中,例如HDFS。在一個Checkpoint執(zhí)行過程中,存儲的狀態(tài)信息及其交互過程,如下圖所示:

flink-checkpointing
在Checkpoint過程中,還有一個比較重要的操作——Stream Aligning。當Operator接收到多個輸入的數(shù)據(jù)流時,需要在Snapshot Barrier中對數(shù)據(jù)流進行排列對齊,如下圖所示:

flink-stream-aligning
具體排列過程如下:
Operator從一個incoming Stream接收到Snapshot Barrier n,然后暫停處理,直到其它的incoming Stream的Barrier n(否則屬于2個Snapshot的記錄就混在一起了)到達該Operator
接收到Barrier n的Stream被臨時擱置,來自這些Stream的記錄不會被處理,而是被放在一個Buffer中
一旦最后一個Stream接收到Barrier n,Operator會emit所有暫存在Buffer中的記錄,然后向Checkpoint Coordinator發(fā)送Snapshot n
繼續(xù)處理來自多個Stream的記錄
基于Stream Aligning操作能夠實現(xiàn)Exactly alt="物聯(lián)網(wǎng)" width="550" height="346" />
flink-job-and-execution-graph
通過上圖可以看出:
JobGraph是一個Job的用戶邏輯視圖表示,將一個用戶要對數(shù)據(jù)流進行的處理表示為單個DAG圖(對應于JobGraph),DAG圖由頂點(JobVertex)和中間結果集(IntermediateDataSet)組成,其中JobVertex表示了對數(shù)據(jù)流進行的轉換操作,比如map、flatMap、filter、keyBy等操作,而IntermediateDataSet是由上游的JobVertex所生成,同時作為下游的JobVertex的輸入。
而ExecutionGraph是JobGraph的并行表示,也就是實際JobManager調度一個Job在TaskManager上運行的邏輯視圖,它也是一個DAG圖,是由ExecutionJobVertex、IntermediateResult(或IntermediateResultPartition)組成,ExecutionJobVertex實際對應于JobGraph圖中的JobVertex,只不過在ExecutionJobVertex內部是一種并行表示,由多個并行的ExecutionVertex所組成。另外,這里還有一個重要的概念,就是Execution,它是一個ExecutionVertex的一次運行Attempt,也就是說,一個ExecutionVertex可能對應多個運行狀態(tài)的Execution,比如,一個ExecutionVertex運行產(chǎn)生了一個失敗的Execution,然后還會創(chuàng)建一個新的Execution來運行,這時就對應這個2次運行Attempt。每個Execution通過ExecutionAttemptID來唯一標識,在TaskManager和JobManager之間進行Task狀態(tài)的交換都是通過ExecutionAttemptID來實現(xiàn)的。
下面看一下,在物理上進行調度,基于資源的分配與使用的一個例子,來自官網(wǎng),如下圖所示:

flink-scheduled-task-slots
說明如下:
左上子圖:有2個TaskManager,每個TaskManager有3個Task Slot
左下子圖:一個Flink Job,邏輯上包含了1個data source、1個MapFunction、1個ReduceFunction,對應一個JobGraph
左下子圖:用戶提交的Flink Job對各個Operator進行的配置——data source的并行度設置為4,MapFunction的并行度也為4,ReduceFunction的并行度為3,在JobManager端對應于ExecutionGraph
右上子圖:TaskManager 1上,有2個并行的ExecutionVertex組成的DAG圖,它們各占用一個Task Slot
右下子圖:TaskManager 2上,也有2個并行的ExecutionVertex組成的DAG圖,它們也各占用一個Task Slot
在2個TaskManager上運行的4個Execution是并行執(zhí)行的
迭代機制
機器學習和圖計算應用,都會使用到迭代計算,F(xiàn)link通過在迭代Operator中定義Step函數(shù)來實現(xiàn)迭代算法,這種迭代算法包括Iterate和Delta Iterate兩種類型,在實現(xiàn)上它們反復地在當前迭代狀態(tài)上調用Step函數(shù),直到滿足給定的條件才會停止迭代。下面,對Iterate和Delta Iterate兩種類型的迭代算法原理進行說明:
Iterate
Iterate Operator是一種簡單的迭代形式:每一輪迭代,Step函數(shù)的輸入或者是輸入的整個數(shù)據(jù)集,或者是上一輪迭代的結果,通過該輪迭代計算出下一輪計算所需要的輸入(也稱為Next Partial Solution),滿足迭代的終止條件后,會輸出最終迭代結果,具體執(zhí)行流程如下圖所示: