Flink狀態管理和容錯機制介紹

2021-09-19 16:33:38 字數 2391 閱讀 8895

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類:

2.1.1.keyed states

keyed states的使用

flink也提供了keyed states多種資料結構型別

keyed states的動態擴容

2.1.2.operator state

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的資料量,並提高效能。

4.1.flink在阿里的成長路線

阿里是從2023年開始調研flink,2023年10月啟動blink專案,並完善flink在大規模生產下的一些優化和改進。2023年雙11採用了blink系統,為搜尋,推薦,廣告業務提供服務。2023年5月blink已成為阿里的實時計算引擎。

4.2.阿里在狀態管理和容錯相關的工作

正在做的工作,基於state重構window方面的一些優化,阿里也正在將功能做完善。後續將包括asynchronous checkpoint的功能完善,並和社群進一步溝通和合作。幫助flink社群完善相關方面的工作。

Flink狀態管理和容錯機制介紹

1.1.什麼是有狀態的計算 計算任務的結果不僅僅依賴於輸入,還依賴於它的當前狀態,其實大多數的計算都是有狀態的計算。比如wordcount,給一些word,其計算它的count,這是乙個很常見的業務場景。count做為輸出,在計算的過程中要不斷的把輸入累加到count上去,那麼count就是乙個st...

Flink狀態管理和容錯機制介紹

本文主要內容如下 1.1.什麼是有狀態的計算 計算任務的結果不僅僅依賴於輸入,還依賴於它的當前狀態,其實大多數的計算都是有狀態的計算。比如wordcount,給一些word,其計算它的count,這是乙個很常見的業務場景。count做為輸出,在計算的過程中要不斷的把輸入累加到count上去,那麼co...

Flink 容錯機制

flink使用的是基於chandy lamport演算法的分布式快照 chandy lamport algorithm 有興趣的同學可以看看。檢查點配置 streamexecutionenvironment env streamexecutionenvironment.getexecutionenv...