1. 程式人生 > >Flink 狀態管理

Flink 狀態管理

什麼是狀態(State)

  有些任務的結果不僅僅依賴於當前的輸入,也依賴於之前的輸入結果資訊,因此對中間結果狀態等的儲存就很有必要。
  在Flink中,我們可以這樣理解State:某task/operator在某時刻的一箇中間結果。

狀態型別

  Flink提供了豐富的狀態訪問介面和高效的容錯機制,當前Flink中有兩個基本的state:Keyed state和 Operator state。

1. Keyed state是基於KeyedStream上的狀態,這個狀態與特定的key繫結。對於KeyedStream流上每一個key都對應一個state(一個Task可能包含多個Key,不同的Task上不會出現相同的Key)。
當前Flink提供的Keyed state資料結構是: ValueState<T>、ListState<T>、ReduceState<T>、MapState<T>。
2. Operator state跟一個特定的Operator的一個併發例項繫結,一個task對應一個state。
當前Flink提供的Operator state資料結構是: ListState<T>
  舉例來說,Flink中的Kafka Connector,就使用了operator state。它會在每個connector例項中,儲存該例項中消費topic的所有(partition, offset)對映。

Keyed state

Operator state

原始狀態和Flink託管狀態 (Raw and Managed State)

  Keyed State和Operator State,可以以兩種形式存在:原始狀態和託管狀態。
  託管狀態是由Flink框架管理的狀態,如ValueState, ListState, MapState等。

Flink狀態框架的類圖   而raw state即原始狀態,由使用者自行管理狀態具體的資料結構,框架在做checkpoint的時候,使用byte[]來讀寫狀態內容,對其內部資料結構一無所知。通常在DataStream上的狀態推薦使用託管的狀態,當實現一個使用者自定義的operator時,會使用到原始狀態。

Checkpoint

  Checkpoint是Flink管理狀態容錯的手段,檢查點允許Flink恢復流中的狀態及位置,從而是應用程式正確無誤的執行。預設情況下,禁用檢查點,狀態儲存在TaskManager的記憶體中,檢查點儲存在JobManager記憶體中。
  Checkpoint是Flink中輕量級的分散式非同步快照的機制。Flink流式計算模型中包含Source Operator、Transformation Operators、Sink Operator等三種不同型別的節點,分別負責資料的輸入、處理、和輸出,對應計算拓撲的起點、中間節點和終點。Flink分散式快照的核心是Barrier,這些Barrier週期性的被注入到資料流並作為資料流的一部分流入到到所有的Source中,Source節點看到Barrier後,會立即記錄自己的狀態,然後將Barrier傳送到Transformation Operator;當Transformation Operator從某個input channel收到Barrier後,它會立刻Block住這條通道,直到所有的input channel都收到Barrier,此時該Operator就會記錄自身狀態,並向自己的所有output channel廣播Barrier。Sink接受Barrier的操作流程與Transformation Oper一樣。當所有的Barrier都到達Sink之後,並且所有的Sink也完成了Checkpoint,這一輪Snapshot就完成了。
  Block Input實際上是有負面效果的,一旦某個input channel發生延遲,Barrier遲遲未到,這會導致Transformation Operator上的其它通道全部堵塞,系統吞吐大幅下降。但是這麼做的一個最大的好處就是能夠實現Exactly Once。不過Flink還是提供了選項,可以關閉Exactly once並僅保留at least once,以提供最大限度的吞吐能力。