Flink中的State概念及其擴容算法 state是什么意思

在流計算場景中,數據會不斷流入Apache Flink系統,每一條進入Apache Flink系統的數據都會觸發計算 。如果要做Count聚合計算,是每次觸發計算都重新計算歷史上所有的流入數據,還是每次都根據上一次的計算結果做增量計算?答案是肯定的,Apache Flink根據上一次計算結果進行增量計算 。那么問題來了:“最后的計算結果保存在哪里,能保存在內存中嗎?”答案是否定的 。如果存儲在內存中,當一個計算節點由于網絡、硬件等原因出現故障時,最后的計算結果就會丟失 。當節點恢復時,需要重新計算歷史上所有的數據(可能是十天或幾百天的數據),所以為了避免這個災難性的問題,Apache Flink會使用State來存儲計算結果 。本文將向您介紹阿帕奇弗林克州 。

Flink中的State概念及其擴容算法 state是什么意思

文章插圖

什么是國家?這個問題好像有點“弱智”?不管問題的答案是否明顯,我還是想簡單說一下弗林克是什么州 。狀態是指流計算過程中計算節點的中間計算結果或元數據屬性 。例如,在匯總過程中,中間匯總結果應記錄在State中 。例如,當使用Apache Kafka作為數據源時,我們還應該記錄讀取記錄的偏移量,這些狀態數據將在計算過程中被持久化(插入或更新) 。因此,Flink中的狀態是Flink任務內部數據(計算數據和元數據屬性)的快照,與時間相關 。
你為什么需要國家?與批處理計算相比,狀態是流計算獨有的 。批處理計算沒有故障轉移機制,因此它要么成功,要么重新計算 。在大多數情況下,計算是遞增的,數據是逐個處理的(大多數情況) 。每次計算都是根據最后的計算結果進行的 。該機制綁定存儲最后的計算結果(生產模式應該是持久的) 。此外,由于機器、網絡、臟數據等原因導致的程序錯誤,在重新啟動作業時,需要從成功的檢查點(后面章節會介紹)恢復狀態 。增量計算和故障轉移都需要狀態的支持 。
狀態存儲實現Flink中有三種狀態的存儲實現,如下所示:
基于內存的heapstate后端-在調試模式下使用,不建議在生產模式下使用;
fsstatefender——基于HDFS的分布式文件持久化,每次讀寫都操作內存,也需要考慮OOM
基于RocksDB的RocksDB后端——本地文件+異步HDFS持久化;
狀態存儲模式默認情況下,Apache Flink將State存儲在RocksDB+HDFS 。狀態存儲分為兩個階段:首先,它被本地存儲在RocksDB中,然后異步同步到遠程HDFS 。這種設計不僅消除了heapstate后端的限制(內存大小、機器損壞和丟失等) 。),還降低了純分布式存儲的網絡IO開銷 。
Flink中的State概念及其擴容算法 state是什么意思

文章插圖

狀態分類KeyedState——這里的鍵是SQL語句中我們對應的groupby/PartitionBy中的字段,鍵的值是group by/partition by字段組成的Row的字節數組,每個鍵都有自己的狀態,鍵與鍵之間的狀態是不可見的;
在OperatorState-Flink內部的源連接器的實現中,OperatorState將用于記錄源數據讀取的偏移量 。
產能擴張期間的狀態再分配Flink是一個允許大規模有狀態流處理的大規模并行分布式系統 。為了可伸縮性,Flink作業在邏輯上分解為操作符圖,每個操作符的執行在物理上分解為多個并行操作符實例 。從概念上來說,Flink中的每個并行操作器實例都是一個獨立的任務,可以安排它在自己機器上連接到網絡的其他機器上運行 。
在Flink的DAG圖中,只有邊緣連接的節點有網絡通信,即整個DAG在垂直方向有網絡IO,在水平方向有狀態的節點之間沒有網絡通信,如下圖所示 。該模型還確保每個操作員實例保持自己的狀態,并將其保存在本地磁盤中(遠程異步同步) 。通過這種設計,任務的所有狀態數據都是本地的,并且狀態訪問不需要任務之間的網絡通信 。避免這種流量對于像Flink這樣的大規模并行分布式系統的可擴展性非常重要 。
【Flink中的State概念及其擴容算法 state是什么意思】如上所述,Flink中的State有OperatorState和KeyedState,那么擴展(增加并發)時如何分配狀態呢?例如,外部Source有五個分區,從Source的一個并發擴展到Flink上的兩個并發,中間的Stateful Operation節點由兩個并發和擴展的三個并發組成,如下圖所示:
Flink中的State概念及其擴容算法 state是什么意思

文章插圖

在Flink中,不同類型的狀態有不同的擴展方法,接下來我們將分別介紹 。
運營商對產能擴張的處理我們選擇了Flink中連接器實現的一個具體例子來介紹 。以MetaQ為例 。MetaQ按主題訂閱數據,每個主題將有N>0個分區 。如上圖所示,假設我們訂閱的MetaQ主題有5個分區,那么當我們的源從一個并發調整到兩個并發時,狀態會如何恢復呢?

推薦閱讀