Paimon 支持針對多個并發(fā)寫入任務的樂觀并發(fā)控制。
每個作業(yè)都會按照自身的節(jié)奏寫入數(shù)據(jù),并在提交時基于當前的快照應用增量文件(刪除或添加文件)來生成新的快照。
這里可能會出現(xiàn)兩種類型的提交失敗情況:
- 快照沖突:快照 ID 已被搶占,該表已由另一項作業(yè)生成了新的快照。好的,讓我們再次提交。
- 文件沖突:此作業(yè)想要刪除的文件已被其他作業(yè)刪除。此時,該作業(yè)只能失敗。(對于流式作業(yè),它會失敗并重新啟動,還會有意地進行一次故障轉移)
快照沖突
Paimon的快照 ID 是唯一的,因此只要作業(yè)將快照文件寫入文件系統(tǒng),就視為作業(yè)成功完成。

Paimon 利用文件系統(tǒng)的重命名機制來提交快照,這對于 HDFS 來說是很安全的,因為它能確保重命名操作具有事務性和原子性。
但對于諸如 OSS 和 S3 這樣的對象存儲而言,它們的“RENAME”操作并不具備原子性語義。我們需要配置 Hive 或者 JDBC 元數(shù)據(jù)存儲,并為Catelog啟用“l(fā)ock.enabled”選項。否則,可能會有丟失快照的風險。
文件沖突
當 Paimon 執(zhí)行文件刪除操作(這僅是邏輯刪除操作)時,它會檢查與最新快照是否存在沖突。如果存在沖突(意味著該文件已被邏輯刪除),那么它就無法繼續(xù)在當前提交節(jié)點上進行操作,因此只能有意觸發(fā)故障轉移以重新啟動,并且該作業(yè)會從文件系統(tǒng)中獲取最新狀態(tài),以期解決此沖突。

Paimon會確保這里不會出現(xiàn)數(shù)據(jù)丟失或重復的情況,但如果兩個流式傳輸任務同時進行寫入操作,并且出現(xiàn)了沖突,您就會發(fā)現(xiàn)它們會不斷地重新啟動,這可不是什么好事。
沖突的本質(zhì)在于刪除文件(從邏輯上講),而刪除文件源于壓縮操作,所以只要我們關閉寫入任務的壓縮操作(將“只寫”設置為“真”),然后啟動一個單獨的任務來進行壓縮工作,一切就都很好了。
See dedicated compaction job for more info.