Flink的狀態介紹和有狀態的計算

推薦大家去看原文博主的文章,條理清晰閱讀方便,轉載是爲了方便以後個人查閱

https://blog.csdn.net/sghuu/article/details/103696508

1 Flink的狀態指的是

 1.1.維護的狀態變量,鍵控狀態
值狀態(Value state)
爲每個鍵存儲一個任意類型的單個值。複雜數據結構也可以存儲爲值狀態。
列表狀態(List state)
爲每個鍵存儲一個值的列表。列表裏的每個數據可以是任意類型。
映射狀態(Map state)
爲每個鍵存儲一個鍵值映射(map)。map的key和value可以是任意類型。

 1.2.算子的狀態保存,即checkPoint
Apache Flink將應用程序狀態,存儲在內存或者嵌入式數據庫中。由於Flink是一個分佈式系統,因此需要保護本地狀態以防止在應用程序或計算機故障時數據丟失。 Flink通過定期將應用程序狀態的一致性檢查點(check point)寫入遠程且持久的存儲,來保證這一點
列表狀態(List state)
將狀態表示爲一組數據的列表。
聯合列表狀態(Union list state)
也將狀態表示爲數據的列表。它與常規列表狀態的區別在於,在發生故障時,或者從保存點(savepoint)啓動應用程序時如何恢復。我們將在後面繼續討論。
廣播狀態(Broadcast state)
如果一個算子有多項任務,而它的每項任務狀態又都相同,那麼這種特殊情況最適合應用廣播狀態。在保存檢查點和重新調整算子並行度時,會用到這個特性。

狀態後端(State Backends)
每傳入一條數據,有狀態的算子任務都會讀取和更新狀態。由於有效的狀態訪問對於處理數據的低延遲至關重要,因此每個並行任務都會在本地維護其狀態,以確保快速的狀態訪問。
狀態後端主要負責兩件事:本地的狀態管理,以及將檢查點(checkpoint)狀態寫入遠程存儲。
Flink提供了默認的狀態後端,會將鍵控狀態作爲內存中的對象進行管理,將它們存儲在JVM堆上。另一種狀態後端則會把狀態對象進行序列化,並將它們放入RocksDB中,然後寫入本地硬盤。第一種方式可以提供非常快速的狀態訪問,但它受內存大小的限制;而訪問RocksDB狀態後端存儲的狀態速度會較慢,但其狀態可以增長到非常大。
狀態檢查點的寫入也非常重要,這是因爲Flink是一個分佈式系統,而狀態只能在本地維護。 TaskManager進程(所有任務在其上運行)可能在任何時間點掛掉。因此,它的本地存儲只能被認爲是不穩定的。狀態後端負責將任務的狀態檢查點寫入遠程的持久存儲。寫入檢查點的遠程存儲可以是分佈式文件系統,也可以是數據庫。不同的狀態後端在狀態檢查點的寫入機制方面有所不同。例如,RocksDB狀態後端支持增量的檢查點,這對於非常大的狀態來說,可以顯著減少狀態檢查點寫入的開銷。

2 有狀態的計算

有狀態計算是指在程序計算過程中,在Flink程序內部存儲計算產生的中間結果,並提供給後續Function或算子計算結果使用。狀態數據可以維繫在本地存儲中,這裏的存儲可以是Flink的堆內存或者堆外內存,也可以藉助第三方的存儲介質,例如Flink中已經實現的RocksDB,當然用戶也可以自己實現相應的緩存系統去存儲狀態信息,以完成更加複雜的計算邏輯。
和狀態計算不同的是,無狀態計算不會存儲計算過程中產生的結果,也不會將結果用於下一步計算過程中,程序只會在當前的計算流程中實行計算,計算完成就輸出結果,然後下一條數據接入,然後再處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章