第 22 節 Flink 狀態、恢復、快照

上篇:第 21 節 Flink Distributed Cache(分佈式緩存)


1、Flink 狀態(State)管理與恢復

(1)狀態(State)

我們前面寫的wordcount的例子,沒有包含狀態管理。如果一個task在處理過程中掛掉了,那麼它在內存中的狀態都會丟失,所有的數據都需要重新計算。從容錯和消息處理的語義上(at
least once, exactly once),Flink引入了state和checkpoint。

首先區分一下兩個概念

state一般指一個具體的task/operator的狀態

state數據默認保存在java的堆內存中
而checkpoint

可以理解爲checkpoint是把state數據持久化存儲了
則表示了一個Flink Job在一個特定時刻的一份全局狀態快照,即包含了所有task/operator的狀態

注意:task是Flink中執行的基本單位。operator指算子(transformation)。

State可以被記錄,在失敗的情況下數據還可以恢復
Flink中有兩種基本類型的State
Keyed State
Operator State

(2)狀態(State)

  1. Keyed State和Operator State,可以以兩種形式存在:
    原始狀態(raw state)
  2. 託管狀態(managed state)
  3. 託管狀態是由Flink框架管理的狀態
  4. 而原始狀態,由用戶自行管理狀態具體的數據結構,框架在做checkpoint的時候,使用byte[]來讀寫狀態內容,對其內部數據結構一無所知。
  5. 通常在DataStream上的狀態推薦使用託管的狀態,當實現一個用戶自定義的operator時,會使用到原始狀態。

2、State-Keyed State

  1. 顧名思義,就是基於KeyedStream上的狀態。這個狀態是跟特定的key綁定的,對KeyedStream流上的每一個key,都對應一個state。
    stream.keyBy(…)
  2. 保存state的數據結構
    ValueState:即類型爲T的單值狀態。這個狀態與對應的key綁定,是最簡單的狀態了。它可以通過update方法更新狀態值,通過value()方法獲取狀態值
    ListState:即key上的狀態值爲一個列表。可以通過add方法往列表中附加值;也可以通過get()方法返回一個Iterable來遍歷狀態值
    ReducingState:這種狀態通過用戶傳入的reduceFunction,每次調用add方法添加值的時候,會調用reduceFunction,最後合併到一個單一的狀態值
    MapState<UK, UV>:即狀態值爲一個map。用戶通過put或putAll方法添加元素
  3. 需要注意的是,以上所述的State對象,僅僅用於與狀態進行交互(更新、刪除、清空等),而真正的狀態值,有可能是存在內存、磁盤、或者其他分佈式存儲系統中。相當於我們只是持有了這個狀態的句柄

在這裏插入圖片描述


3、State-Operator State

  1. 與Key無關的State,與Operator綁定的state,整個operator只對應一個state
  2. 保存state的數據結構
    ListState
  3. 舉例來說,Flink中的Kafka Connector,就使用了operator state。它會在每個connector實例中,保存該實例中消費topic的所有(partition, offset)映射
    在這裏插入圖片描述

4、狀態容錯

  1. 依靠checkPoint機制
  2. 保證exactly-once
    只能保證Flink系統內的exactly-once
    對於source和sink需要依賴外部的組件一同保證
    在這裏插入圖片描述
    在這裏插入圖片描述

5、checkPoint簡介

在這裏插入圖片描述


6、checkPoint的配置

在這裏插入圖片描述
checkPoint的配置

默認checkpoint功能是disabled的,想要使用的時候需要先啓用 StreamExecutionEnvironment env =
StreamExecutionEnvironment.getExecutionEnvironment(); // 每隔1000
ms進行啓動一個檢查點【設置checkpoint的週期】 env.enableCheckpointing(1000); // 高級選項:
// 設置模式爲exactly-once (這是默認值)
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
// 確保檢查點之間有至少500 ms的間隔【checkpoint最小間隔】
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(500); //
檢查點必須在一分鐘內完成,或者被丟棄【checkpoint的超時時間】
env.getCheckpointConfig().setCheckpointTimeout(60000); //
同一時間只允許進行一個檢查點
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1); //
表示一旦Flink處理程序被cancel後,會保留Checkpoint數據,以便根據實際需要恢復到指定的Checkpoint【詳細解釋見備註】
env.getCheckpointConfig().enableExternalizedCheckpoints(ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);

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