文章目錄
前言
當我們經常在談論一個Flink任務是否是有狀態的,此時我們談論的點其實就是Flink內部的State的概念。但是這里的State的概念已經不是單純指我們平時所說的Event–>State這樣的比較固定的概念,更確切地說,它是一種運行間的數據信息。這些狀態數據在容錯恢復及checkpoint時將起到很關鍵的作用。本文筆者來聊聊Flink State的相關內容,包括State的類型划分,State的序列化內容等等。
Flink的State類型
基本類型划分
在Flink中,按照基本類型,對State做了以下兩類的划分:
- Keyed State,和Key有關的狀態類型,它只能被基於KeyedStream之上的操作,方法所使用。我們可以從邏輯上理解這種狀態是一個並行度操作實例和一種Key的對應, <parallel-operator-instance, key>。
- Operator State(或者non-keyed state),它是和Key無關的一種狀態類型。相應地我們從邏輯上去理解這個概念,它相當於一個並行度實例,對應一份狀態數據。因為這里沒有涉及Key的概念,所以在並行度(擴/縮容)發生變化的時候,這里會有狀態數據的重分布的處理。
組織形式划分
但是在這里還有一種按照組織形式的划分,也可以理解為按照runtime層面的划分,又可以分為一下兩類:
- Managed State,這類State的內部結構完全由Flink runtime內部來控制,包括如何將它們編碼寫入到checkpoint中等等。
- Raw State,這類State就比較顯得靈活一些,它們被保留在操作運行實例內部的數據結構中。從Flink系統角度來觀察,在checkpoint時,它只知道的是這些狀態數據是以連續字節的形式被寫入checkpoint中。等待進行狀態恢復時,又從字節數據反序列化為狀態對象。
Managed State可以在所有的data stream相關方法中被使用,官方也是推薦優先使用這類State,因為它能被Flink runtime內部做自動重分布而且能被更好地進行內存管理。
State Time-To-Live (TTL)
在Flink內部,我們能夠對State設置TTL,使其狀態過期然后被系統清理掉。針對State TTL,可詳見StateTtlConfig類的配置設置。
另類的一種State:Broadcast State模式
Broadcast State具有Broadcast流的特殊屬性,它是一種小數據狀態廣播向其它流的形式,從而避免大數據流量的傳輸。在這里,其它流是對廣播狀態只有只讀操作的允許,因為不同任務間沒有跨任務的信息交流。一旦有運行實例對於廣播狀態數據進行更新了,就會造成狀態不一致現象。
State的可查詢性
State狀態是一類能夠反映任務當前執行情況的信息數據。所以當我們想要了解任務的執行情況時,我們就會想能不能夠去查詢里面的狀態信息呢?Flink官方給出的答案是可以的,它有提供相關的API不過還不保證其完全穩定性。而且這里有一點需要注意,當我們對狀態進行查詢時,同時地它的信息被並發修改。Flink為了避免Job的處理延時,並沒有對此做完全地同步控制。
除了通過API的獲取方式外,這里還支持一種*QueryableStateStream 來獲取狀態數據的方式。任務狀態數據將會更新到QueryableStateStream *流中,可以理解為是State的一個sink。
定制化State序列化/反序列實現
Flink內部支持定制化的State序列化器/反序列化實現。這里的序列化過程指的是將狀態數據序列為字節數據寫到checkpoint中,再從checkpoint文件字節數據反序列為狀態對象數據。針對不同類型的State數據,可以定義各自不同的序列化/反序列的實現。
State的序列化演進
這來還存在異構序列化實現的演進問題,因為存在一種情況,任務在恢復狀態數據時,會由新的序列化引入。如果出現新的序列化實現無法讀取老的狀態數據,那么需要做一個兼容性的改動,進行狀態遷移,或者先用老的序列化實現讀取老狀態,然后新的狀態用新的序列化方式寫出。
State在Flink任務的運行時保存了非常重要的數據,明白如何去更好地使用State將會對我們了解,恢復任務有着很大的幫助。
引用
[1].https://ci.apache.org/projects/flink/flink-docs-master/dev/stream/state/state.html
[2].https://ci.apache.org/projects/flink/flink-docs-master/dev/stream/state/broadcast_state.html
[3].https://ci.apache.org/projects/flink/flink-docs-master/dev/stream/state/queryable_state.html
[4].https://ci.apache.org/projects/flink/flink-docs-master/dev/stream/state/schema_evolution.html