使用 分布式快照機制 和 兩階段提交
兩階段提交
在 Flink 中兩階段提交的實現方法被封裝到了 TwoPhaseCommitSinkFunction 這個抽象類中,我們只需要實現其中的beginTransaction、preCommit、commit、abort 四個方法就可以實現“精確一次”的處理語義,實現的方式我們可以在官網中查到:
-
beginTransaction,在開啟事務之前,我們在目標文件系統的臨時目錄中創建一個臨時文件,后面在處理數據時將數據寫入此文件;
-
preCommit,在預提交階段,刷寫(flush)文件,然后關閉文件,之后就不能寫入到文件了,我們還將為屬於下一個檢查點的任何后續寫入啟動新事務;
-
commit,在提交階段,我們將預提交的文件原子性移動到真正的目標目錄中,請注意,這會增加輸出數據可見性的延遲;
-
abort,在中止階段,我們刪除臨時文件。