flink-checkpoint

Checkpoint

Flink 容錯機制的核心就是持續創建分佈式數據流及其狀態的一致快照。Flink的checkpoint 是通過分佈式快照實現的,所以在flink中這兩個詞是一個意思。

checkpoint機制需要一個可靠的可以回放數據的數據源(kafka,RabbitMQ,HDFS…)和一個存放state的持久存儲(HDFS,S3…)。

1,checkpointConfig

通過調用StreamExecutionEnvironment.enableCheckpointing(internal,mode)啓用checkpoint。 internal默認是-1,表示checkpoint不開啓,mode默認是EXACTLY_ONCE模式。

可設置checkpoint timeout,超過這個時間checkpoint沒有成功,checkpoint終止。默認10分鐘。

可設置checkpoint失敗任務是否也失敗,默認是true。

可設置同時進行的checkpoint數量,默認爲1。

2,barrier

將barrier插入到數據流中,作爲數據流的一部分和數據一起向下流動。Barrier 不會干擾正常數據,數據流嚴格有序。一個 barrier 把數據流分割成兩部分:一部分進入到當前快照,另一部分進入下一個快照。每一個 barrier 都帶有快照 ID,並且 barrier 之前的數據都進入了此快照。Barrier 不會干擾數據流處理,所以非常輕量。多個不同快照的多個 barrier 會在流中同時出現,即多個快照可能同時創建。

Barrier 在數據源端插入,當 snapshot n 的 barrier 插入後,系統會記錄當前 snapshot 位置值 n (用Sn表示)。例如,在 Apache Kafka 中,這個變量表示某個分區中最後一條數據的偏移量。這個位置值 Sn 會被髮送到一個稱爲 checkpoint coordinator 的模塊。

然後 barrier 繼續往下流動,當一個 operator 從其輸入流接收到所有標識 snapshot n 的 barrier 時,它會向其所有輸出流插入一個標識 snapshot n 的 barrier。當 sink operator (DAG 流的終點)從其輸入流接收到所有 barrier n 時,它向 the checkpoint coordinator 確認 snapshot n 已完成。當所有 sink 都確認了這個快照,快照就被標識爲完成。

3,如何觸發checkpoint?

在生成EcecutionGraph過程中會註冊狀態監聽器CheckpointCoordinatorDeActivator,負責監聽job狀態,job變爲運行狀態時,執行startCheckpointScheduler方法定時執行ScheduledTrigger,ScheduledTrigger中執行的是triggerCheckpoint方法。

在進行一些條件檢查之後,首先會構造出一個PendingCheckpoint實例,然後再放到隊列裏,只有當jobmanager收到SinkTask發來的checkpoint保存成功的消息後,這個PendingCheckpoint纔會變成CompletedCheckpoint,這才代表一次checkpoint保存操作真正的完成了。

 

4,代碼展示

StreamExecutionEnvironment see = StreamExecutionEnvironment.getExecutionEnvironment();

// 設置保存點的保存路徑,這裏保存在hdfs中

see.setStateBackend((StateBackend)new RocksDBStateBackend("hdfs://localhost:9000/user/flink-checkpoints"));

CheckpointConfig checkpointConfig = see.getCheckpointConfig();

// 任務流取消和故障應保留檢查點,,一旦Flink處理程序被cancel後,會保留Checkpoint數據,以便根據實際需要恢復到指定的Checkpoint處理

checkpointConfig.enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);

// 保存點模式:exactly_once

checkpointConfig.setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);

// 觸發保存點的時間間隔,確保檢查點之間有至少30000 ms的間隔【checkpoint最小間隔是500ms】

checkpointConfig.setCheckpointInterval(30000);

// 同一時間只允許進行一個檢查點

checkpointConfig.setMaxConcurrentCheckpoints(1);

// 保存點的超時時間,檢查點必須在一分鐘內完成,或者被丟棄【checkpoint的超時時間】

checkpointConfig.setCheckpointTimeout(60000);

 

介紹:ExternalizedCheckpointCleanup

  • ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION: 取消作業時保留檢查點。請注意,在這種情況下,您必須在取消後手動清理檢查點狀態。
  • ExternalizedCheckpointCleanup.DELETE_ON_CANCELLATION: 取消作業時刪除檢查點。只有在作業失敗時,檢查點狀態纔可用。

5,保存多個Checkpoint

默認情況下,如果設置了Checkpoint選項,則Flink只保留最近成功生成的1個Checkpoint,而當Flink程序失敗時,可以從最近的這個Checkpoint來進行恢復。但是,如果我們希望保留多個Checkpoint,並能夠根據實際需要選擇其中一個進行恢復,這樣會更加靈活,比如,我們發現最近4個小時數據記錄處理有問題,希望將整個狀態還原到4小時之前。

flink配置文件conf/flink-conf.yaml中,添加如下配置,指定最多需要保存Checkpoint的個數:

state.checkpoints.num-retained: 20

程序運行起來有,每30s保存一次checkpoint,在hdfs保存最新的20個,20個之前的歷史checkpoint會自動刪除

 

6,從某個固定的checkpoint點恢復程序

bin/flink run -s hdfs://namenode01.td.com/flink-1.5.3/flink-checkpoints/582e17d2cc343e6c56255d111bae0191/chk-860/_metadata flink-app-jobs.jar

這是時候flink的jobIb已經變了,接着chk-860程序繼續進行

 

發佈了16 篇原創文章 · 獲贊 1 · 訪問量 2039
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章