本文主要內容如下:
1.1.什麼是有狀態的計算#
計算任務的結果不僅僅依賴於輸入,還依賴於它的當前狀態,其實大多數的計算都是有狀態的計算。 比如wordcount,給一些word,其計算它的count,這是乙個很常見的業務場景。count做為輸出,在計算的過程中要不斷的把輸入累加到count上去,那麼count就是乙個state。
1.2.傳統的流計算系統缺少對於程式狀態的有效支援#
在傳統的批處理中,資料是劃分為塊分片去完成的,然後每乙個task去處理乙個分片。當分片執行完成後,把輸出聚合起來就是最終的結果。在這個過程當中,對於state的需求還是比較小的。
對於流計算而言,對state有非常高的要求,因為在流系統中輸入是乙個無限制的流,會執行很長一段時間,甚至執行幾天或者幾個月都不會停機。在這個過程當中,就需要將狀態資料很好的管理起來。很不幸的是,在傳統的流計算系統中,對狀態管理支援並不是很完善。比如storm,沒有任何程式狀態的支援,一種可選的方案是storm+hbase這樣的方式去實現,把這狀態資料存放在hbase中,計算的時候再次從hbase讀取狀態資料,做更新在寫入進去。這樣就會有如下幾個問題
1.3.flink豐富的狀態訪問和高效的容錯機制#
flink在最早設計的時候就意識到了這個問題,並提供了豐富的狀態訪問和容錯機制。如下圖所示:
2.1.按照資料的劃分和擴張方式,flink中大致分為2類:#
keyed states的使用
flink也提供了keyed states多種資料結構型別
keyed states的動態擴容
operator states的使用
operator states的資料結構不像keyed states豐富,現在只支援list
operator states多種擴充套件方式
operator states的動態擴充套件是非常靈活的,現提供了3種擴充套件,下面分別介紹:
以上是flink operator states提供的3種擴充套件方式,使用者可以根據自己的需求做選擇。
使用checkpoint提高程式的可靠性
使用者可以根據的程式裡面的配置將checkpoint開啟,給定乙個時間間隔後,框架會按照時間間隔給程式的狀態進行備份。當發生故障時,flink會將所有task的狀態一起恢復到checkpoint的狀態。從哪個位置開始重新執行。
flink也提供了多種正確性的保障,包括:
備份為儲存在state中的程式狀態資料
flink也提供了一套機制,允許把這些狀態放到記憶體當中。做checkpoint的時候,由flink去完成恢復。
從已停止作業的執行狀態中恢復
當元件公升級的時候,需要停止當前作業。這個時候需要從之前停止的作業當中恢復,flink提供了2種機制恢復作業:
下面介紹一下狀態管理和容錯機制實現方式,flink提供了3種不同的statebackend
使用者可以根據自己的需求選擇,如果資料量較小,可以存放到memorystatebackend和fsstatebackend中,如果資料量較大,可以放到rockdb中。
下面介紹heapkeyedstatebackend和rockdbkeyedstatebackend
第一,heapkeyedstatebackend#
第二,rockdbkeyedstatebackend#
checkpoint的執行流程#
checkpoint的執行流程是按照chandy-lamport演算法實現的。
checkpoint barrier的對齊#
全量checkpoint#
全量checkpoint會在每個節點做備份資料時,只需要將資料都便利一遍,然後寫到外部儲存中,這種情況會影響備份效能。在此基礎上做了優化。
rockdb的增量checkpoint#
rockdb的資料會更新到記憶體,當記憶體滿時,會寫入到磁碟中。增量的機制會將新產生的檔案copy持久化中,而之前產生的檔案就不需要copy到持久化中去了。通過這種方式減少copy的資料量,並提高效能。
Flink狀態管理和容錯機制介紹
1.1什麼是有狀態的計算 計算任務的結果不僅僅依賴於輸入,還依賴於它的當前狀態,其實大多數的計算都是有狀態的計算。比如wordcount,給一些word,其計算它的count,這是乙個很常見的業務場景。count做為輸出,在計算的過程中要不斷的把輸入累加到count上去,那麼count就是乙個sta...
Flink狀態管理和容錯機制介紹
1.1.什麼是有狀態的計算 計算任務的結果不僅僅依賴於輸入,還依賴於它的當前狀態,其實大多數的計算都是有狀態的計算。比如wordcount,給一些word,其計算它的count,這是乙個很常見的業務場景。count做為輸出,在計算的過程中要不斷的把輸入累加到count上去,那麼count就是乙個st...
Flink 容錯機制
flink使用的是基於chandy lamport演算法的分布式快照 chandy lamport algorithm 有興趣的同學可以看看。檢查點配置 streamexecutionenvironment env streamexecutionenvironment.getexecutionenv...