




窗口與水位線





window的執(zhí)行也是由Watermark觸發(fā)的。 Watermark可以理解成一個延遲觸發(fā)機制,我們可以設置Watermark的延時時長t,每次系統(tǒng)會校驗已經(jīng)到達的數(shù)據(jù)中最大的maxEventTime,然后認定eventTime小于maxEventTime - t的所有數(shù)據(jù)都已經(jīng)到達,如果有窗口的停止時間等于maxEventTime – t,那么這個窗口被觸發(fā)執(zhí)行
TimeWindow 和 TimeWindowAll 都適用于對流式數(shù)據(jù)轉(zhuǎn)化做一定時間范圍內(nèi)的批處理,主要區(qū)別在兩者的并行度,前者為 Parallel Operator 后者為 Non Parallel Operator,所以 TimeWindow 的適用范圍更廣,適合一些需要對數(shù)據(jù)分批分 key處理且數(shù)據(jù)量較大需要并行處理的場景;而 TimeWindowAll 匯聚一段時間內(nèi)的所有數(shù)據(jù),適合需要匯總所有數(shù)據(jù)或者數(shù)據(jù)量不大的任務,這樣可以減少并發(fā),例如任務內(nèi)需要涉及到數(shù)據(jù)網(wǎng)絡 IO,如果并行度過高則容易導致網(wǎng)絡服務過載。
B.轉(zhuǎn)換
TimeWindow 的并行度變成 1 則變?yōu)?TimeWindowAll;如果 TimeWindowAll 的數(shù)據(jù)實在很大,可以先通過一層 TimeWindow 做分區(qū)的匯總,隨后將數(shù)據(jù)回收至 TimeWindowAll 做總的匯總,有點類似 Spark 的 groupByKey 和 reduceByKey。
Exactly Once

source可重設讀取位置:例如kafka可支持消息回放。

冪等寫入:可能出現(xiàn)ABA問題,在云搜的gaia里面進行增量回溯時就有這個問題。

事務寫入:checkpoint+ 預寫日志(wal,不完全可靠,可能在sink時失敗),而兩階段提交(2pc)更加可靠,但要求外部sink系統(tǒng)支持事務,例如kafka也可以支持預提交,uncommitted數(shù)據(jù)是不允許被消費的。不過kafka默認隔離級別是read_uncommitted,需要配置成read_committed(不過隔離級別提高,會增加消費延遲)。





以kafka-flink-kafka的常見流式處理為例,實現(xiàn)exactly-once操作如下:




