有沒有什么辦法能處理Flink長(zhǎng)期延遲的數(shù)據(jù)呢?
水印機(jī)制(水位線、watermark)可以幫助我們?cè)诙唐谘舆t下,允許亂序數(shù)據(jù)的到來。
這個(gè)機(jī)制很好的處理了那些因?yàn)榫W(wǎng)絡(luò)等情況短期延遲的數(shù)據(jù),讓窗口等它們一會(huì)兒。
但是水印機(jī)制無法長(zhǎng)期的等待下去,因?yàn)樗C(jī)制簡(jiǎn)單說就是讓窗口一直等在那里,等達(dá)到水印時(shí)間才會(huì)觸發(fā)計(jì)算和關(guān)閉窗口
這個(gè)等待不能一直等,因?yàn)闀?huì)一直緩著數(shù)據(jù)不計(jì)算。
一般水印也就是幾秒鐘最多幾分鐘而已(看業(yè)務(wù))

那么,在現(xiàn)實(shí)世界中,延遲數(shù)據(jù)除了有短期延遲外,長(zhǎng)期延遲也是很常見的。
比如:
客戶端斷網(wǎng),等了好幾個(gè)小時(shí)才恢復(fù)
車聯(lián)網(wǎng)系統(tǒng)進(jìn)入隧道后沒有信號(hào)無法上報(bào)數(shù)據(jù)
手機(jī)欠費(fèi)沒有網(wǎng)
等等,這些場(chǎng)景下數(shù)據(jù)的遲到就不是簡(jiǎn)單的網(wǎng)絡(luò)堵塞造成的幾秒延遲了
而是小時(shí)、天級(jí)別的延遲。
對(duì)于水印來說,這樣的長(zhǎng)期延遲數(shù)據(jù)是無法很好處理的。
那么有沒有什么辦法去處理這些長(zhǎng)期延遲的數(shù)據(jù)呢?讓其可以找到其所屬的窗口正常完成計(jì)算,哪怕晚了幾個(gè)小時(shí)。
這個(gè)場(chǎng)景的解決方式就是:延遲數(shù)據(jù)處理機(jī)制(allowedLateness方法)。
水?。簛y序數(shù)據(jù)處理(時(shí)間很短的延遲)
延遲處理:長(zhǎng)期延遲數(shù)據(jù)的處理機(jī)制
waterMark和Window機(jī)制解決了流式數(shù)據(jù)的亂序問題,對(duì)于因?yàn)檠舆t而順序有誤的數(shù)據(jù),可以根據(jù)eventTime進(jìn)行業(yè)務(wù)處理,對(duì)于延遲的數(shù)據(jù)Flink也有自己的解決辦法,
主要的辦法是給定一個(gè)允許延遲的時(shí)間,在該時(shí)間范圍內(nèi)仍可以接受處理延遲數(shù)據(jù)
設(shè)置允許延遲的時(shí)間是通過allowedLateness(lateness: Time)設(shè)置
保存延遲數(shù)據(jù)則是通過sideOutputLateData(outputTag: OutputTag[T])保存
獲取延遲數(shù)據(jù)是通過DataStream.getSideOutput(tag: OutputTag[X])獲取
后續(xù)的文章我們先分別講解這幾個(gè)方法,再給出具體的實(shí)例加深理解
