Flink中Checkpoint和Savepoint 的 3 個不同點
Savepoint和Checkpoint分別是什么?
Savepoint 是用來為整個流處理應用在某個“時間點”(point-in-time)進行快照生成的功能。該快照包含了數據源讀取到的偏移量(offset),輸入源的位置信息以及整個應用的狀態。借助 分布式快照算法(Chandy-Lamport )的變體,我們可以在應用程序運行中得到某個“時間點”一致的快照。
Savepoint由一個目錄以及一個元數據文件構成。其中目錄中通常為一個很大的二進制文件,文件中包含了整個流應用在Savepoint或Checkpoint的狀態。另外元數據文件通常相對較小,其中包含了指向Savepoint目錄中各個文件的指針。
上面關於Savepoint的介紹與Checkpoint很類似,但是二者還是有一些不同點的。
首先Checkpoint 是 Flink 用來從故障中恢復的機制,它快照下了整個應用程序的狀態,當然也包括輸入源讀取到的位點。當應用發生故障時,Flink 將通過從 Checkpoint 加載應用程序狀態並從恢復出的歷史讀取位點繼續應用的處理,就像什么事情都沒發生一樣。
SavePoint和Checkpoint的3個不同點
Savepoint 和 Checkpoint 作為 Apache Flink 中的兩個非常獨特的兩個特性,它們在實現中看起來也很相似,然而二者之間也有不同的地方,主要包含如下3點:
目標上的差異
從概念上講,Flink 的 Savepoint 和 Checkpoint 的不同之處很像傳統數據庫中備份與恢復日志之間的區別。Savepoint 的主要目標是充當手動備份、恢復暫停作業的方法。相反,Checkpoint 的主要目標是充當 Flink 中的恢復機制,確保能從潛在的故障中恢復。
實現上的差異
Checkpoint 和 Savepoint 在實現上也有不同。由於Savepoint設計時候更多的關注了應用的可移植性,支持對作業進行修改后狀態能保持兼容,對應的,生成的恢復的成本更高;Checkpoint作為一種輕量與快速的機制,它可能利用底層狀態后端的不同功能盡可能快速的恢復數據,如基於RocksDb狀態后端的增量Checkpoint,可以極大加速Checkpoint過程,這種設計使得Checkpoint機制變得更加清量。
生命周期不同
Savepoint 是需要用戶手動進行管理(調度、創建、刪除)的。相反,Checkpoint 是自動和定期的,它們由 Flink 自動地周期性地創建和刪除,無需用戶的交互。
如何使用SavePoint
雖然流式應用處理的數據是持續地生成的,但是存在某些場景需要重新處理之前已經處理過的數據, 此時Savepoint 便派上了用場,它可以在以下幾種情況中使用:
- 部署流應用的一個新版本,如新功能、修復Bug或者一個更好的機器學習模型。
- 引入 A/B 測試,使用相同的源數據測試程序的不同版本,從同一時間點開始測試而不犧牲先前的狀態。
- 在進行應用程序資源擴容或者縮減時使用。
- 流應用程序到進行 Flink 版本切換或者集群遷移時。
結論
Checkpoint 和 Savepoint 是 Flink 中兩個不同的功能,它們滿足了不同場景下的需求以確保一致性、容錯性、作業升級、BUG 修復、遷移、A/B測試等。這兩個功能結合使用可以確保應用程序的狀態在不同的場景和環境中保持不變。