今天聽(tīng)同事做關(guān)于Docker的技術(shù)分享,結(jié)束時(shí)已經(jīng)有點(diǎn)晚了,沒(méi)法仔細(xì)選題哼转,所以就寫(xiě)一個(gè)所有人都知道的小知識(shí)點(diǎn)吧明未。
checkpoint(檢查點(diǎn))和savepoint(保存點(diǎn))是Flink為我們提供的兩種作業(yè)快照機(jī)制,它們都包含有作業(yè)狀態(tài)的持久化副本壹蔓。官方文檔這樣描述checkpoint:
Checkpoints make state in Flink fault tolerant by allowing state and the corresponding stream positions to be recovered, thereby giving the application the same semantics as a failure-free execution.
而對(duì)savepoint的描述是:
A Savepoint is a consistent image of the execution state of a streaming job, created via Flink’s checkpointing mechanism. You can use Savepoints to stop-and-resume, fork, or update your Flink jobs.
下面這張來(lái)自Flink 1.1版本文檔的圖(更新的版本這張圖就不見(jiàn)了)示出了checkpoint和savepoint的關(guān)系趟妥。
下面用幾句話(huà)總結(jié)一下。
checkpoint的側(cè)重點(diǎn)是“容錯(cuò)”佣蓉,即Flink作業(yè)意外失敗并重啟之后披摄,能夠直接從早先打下的checkpoint恢復(fù)運(yùn)行,且不影響作業(yè)邏輯的準(zhǔn)確性勇凭。而savepoint的側(cè)重點(diǎn)是“維護(hù)”疚膊,即Flink作業(yè)需要在人工干預(yù)下手動(dòng)重啟、升級(jí)虾标、遷移或A/B測(cè)試時(shí)寓盗,先將狀態(tài)整體寫(xiě)入可靠存儲(chǔ),維護(hù)完畢之后再?gòu)膕avepoint恢復(fù)現(xiàn)場(chǎng)璧函。
savepoint是“通過(guò)checkpoint機(jī)制”創(chuàng)建的傀蚌,所以savepoint本質(zhì)上是特殊的checkpoint。
checkpoint面向Flink Runtime本身蘸吓,由Flink的各個(gè)TaskManager定時(shí)觸發(fā)快照并自動(dòng)清理善炫,一般不需要用戶(hù)干預(yù);savepoint面向用戶(hù)美澳,完全根據(jù)用戶(hù)的需要觸發(fā)與清理销部。
checkpoint的頻率往往比較高(因?yàn)樾枰M可能保證作業(yè)恢復(fù)的準(zhǔn)確度),所以checkpoint的存儲(chǔ)格式非常輕量級(jí)制跟,但作為trade-off犧牲了一切可移植(portable)的東西舅桩,比如不保證改變并行度和升級(jí)的兼容性。savepoint則以二進(jìn)制形式存儲(chǔ)所有狀態(tài)數(shù)據(jù)和元數(shù)據(jù)雨膨,執(zhí)行起來(lái)比較慢而且“貴”擂涛,但是能夠保證portability,如并行度改變或代碼升級(jí)之后聊记,仍然能正橙雎瑁恢復(fù)。
checkpoint是支持增量的(通過(guò)RocksDB狀態(tài)后端)排监,特別是對(duì)于超大狀態(tài)的作業(yè)而言可以降低寫(xiě)入成本狰右。savepoint并不會(huì)連續(xù)自動(dòng)觸發(fā),所以savepoint沒(méi)有必要支持增量舆床。
民那晚安晚安棋蚌。