Flink流計算狀態與容錯

一.概述

有狀態的函數和運算符在處理單個元素/事件的過程中存儲數據,從而使狀態成爲任何類型的更精細操作的關鍵構建塊。

包括:

  • 當應用程序搜索某些事件模式時,狀態將存儲到目前爲止遇到的事件序列。
  • 在每分鐘/小時/天彙總事件時,狀態將保留待處理的彙總。
  • 在數據點流上訓練機器學習模型時,狀態保持模型參數的當前版本。
  • 當需要管理歷史數據時,該狀態允許有效訪問過去發生的事件。

Flink需要了解狀態,以便使用檢查點使狀態容錯並允許流應用程序的保存點。

狀態還允許重新縮放Flink應用程序,這意味着Flink負責在並行實例之間重新分配狀態。

Flink 的可查詢狀態功能允許在運行時從Flink外部訪問狀態。

使用狀態時,閱讀有關Flink的狀態後端的信息也可能會很有用。Flink提供了不同的狀態後端,用於指定狀態的存儲方式和位置。狀態可以位於Java的堆或堆外。根據狀態後端,Flink還可以管理應用程序的狀態,這意味着Flink可以處理內存管理(如有必要,可以落到磁盤上)以允許應用程序保持很大的狀態。可以配置狀態後端,而無需更改應用程序邏輯。

二.工作狀態

Flink中有兩種基本狀態:Keyed State和Operator State。
1.鍵控狀態
鍵控狀態始終與鍵相關,並且只能在KeyedStream中使用函數和運算符。

可以將鍵控狀態視爲已分區或分片的操作狀態,每個鍵僅具有一個狀態分區。每個鍵狀態在邏輯上都綁定到<parallel-operator-instance,key>的唯一組合,並且由於每個鍵都完全屬於鍵操作符的一個並行實例,因此我們可以簡單地將其視爲<operator,key >。

Keyed State被進一步組織成所謂的Key Groups。密鑰組是Flink可以重新分配密鑰狀態的原子單位;與定義的最大並行度完全相同的鍵組數。在執行期間,鍵控運算符的每個並行實例都使用一個或多個鍵組的鍵。
2.操作狀態
使用運算符狀態(或非鍵狀態),每個運算符狀態都綁定到一個並行運算符實例。在kafka連接器使用Flink運營狀況的一個很好激勵的例子。Kafka使用者的每個並行實例都維護一個主題分區和偏移量的映射作爲其操作狀態。

當更改並行性時,操作狀態接口支持在並行操作實例之間重新分配狀態。可以有不同的方案來進行此重新分配。

三.原始狀態和託管狀態

鍵控狀態和操作狀態以兩種形式存在:託管狀態和原始狀態。

託管狀態用Flink運行時控制的數據結構表示,例如內部哈希表或RocksDB。例如“ ValueState”,“ ListState”等。Flink的運行時對狀態進行編碼,並將其寫入檢查點。

原始狀態是操作保留其自己的數據結構的狀態。被檢查點時,它們僅將字節序列寫入檢查點。Flink對狀態的數據結構一無所知,只看到原始字節。

所有數據流功能都可以使用託管狀態,但是原始狀態接口只能在實現運算符時使用。建議使用託管狀態(而不是原始狀態),因爲有了託管狀態,Flink可以在更改並行性時自動重新分配狀態,並且還可以進行更好的內存管理。

注意:如果管理狀態需要自定義序列化邏輯,請參閱相應的指南,以確保將來的兼容性。Flink的默認序列化器不需要特殊處理。

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