2021年大数据Flink(二十二):Time与Watermaker
目錄
Flink-Time與Watermaker
Time分類
EventTime的重要性
示例1
示例2
???????示例3
???????示例4
???????總結(jié)
Watermaker水印機(jī)制/水位線機(jī)制
什么是Watermaker?
???????如何計(jì)算Watermaker?
???????Watermaker有什么用?
???????Watermaker如何觸發(fā)窗口計(jì)算的?
???????圖解Watermaker
Flink-Time與Watermaker
Time分類
在Flink的流式處理中,會(huì)涉及到時(shí)間的不同概念,如下圖所示:
?
事件時(shí)間EventTime: 事件真真正正發(fā)生產(chǎn)生的時(shí)間
攝入時(shí)間IngestionTime: 事件到達(dá)Flink的時(shí)間
處理時(shí)間ProcessingTime: 事件真正被處理/計(jì)算的時(shí)間
?
問題: 上面的三個(gè)時(shí)間,我們更關(guān)注哪一個(gè)?
答案: 更關(guān)注事件時(shí)間 !
因?yàn)? 事件時(shí)間更能反映事件的本質(zhì)! 只要事件時(shí)間一產(chǎn)生就不會(huì)變化
?
EventTime的重要性
示例1
假設(shè),你正在去往地下停車場的路上,并且打算用手機(jī)點(diǎn)一份外賣。選好了外賣后,你就用在線支付功能付款了,這個(gè)時(shí)候是11點(diǎn)59分。恰好這時(shí),你走進(jìn)了地下停車庫,而這里并沒有手機(jī)信號(hào)。因此外賣的在線支付并沒有立刻成功,而支付系統(tǒng)一直在Retry重試“支付”這個(gè)操作。
當(dāng)你找到自己的車并且開出地下停車場的時(shí)候,已經(jīng)是12點(diǎn)01分了。這個(gè)時(shí)候手機(jī)重新有了信號(hào),手機(jī)上的支付數(shù)據(jù)成功發(fā)到了外賣在線支付系統(tǒng),支付完成。
?
在上面這個(gè)場景中你可以看到,
支付數(shù)據(jù)的事件時(shí)間是11點(diǎn)59分,而支付數(shù)據(jù)的處理時(shí)間是12點(diǎn)01分
?
問題:
如果要統(tǒng)計(jì)12之前的訂單金額,那么這筆交易是否應(yīng)被統(tǒng)計(jì)?
答案:
應(yīng)該被統(tǒng)計(jì),因?yàn)樵摂?shù)據(jù)的真真正正的產(chǎn)生時(shí)間為11點(diǎn)59分,即該數(shù)據(jù)的事件時(shí)間為11點(diǎn)59分,
事件時(shí)間能夠真正反映/代表事件的本質(zhì)! 所以一般在實(shí)際開發(fā)中會(huì)以事件時(shí)間作為計(jì)算標(biāo)準(zhǔn)
?
???????示例2
一條錯(cuò)誤日志的內(nèi)容為:
2020-11:11?22:59:00?error NullPointExcep?--事件時(shí)間
進(jìn)入Flink的時(shí)間為2020-11:11?23:00:00 ???--攝入時(shí)間
到達(dá)Window的時(shí)間為2020-11:11?23:00:10 --處理時(shí)間
問題:
對(duì)于業(yè)務(wù)來說,要統(tǒng)計(jì)1h內(nèi)的故障日志個(gè)數(shù),哪個(gè)時(shí)間是最有意義的?
答案:
EventTime事件時(shí)間,因?yàn)閎ug真真正正產(chǎn)生的時(shí)間就是事件時(shí)間,只有事件時(shí)間才能真正反映/代表事件的本質(zhì)!
?
???????示例3
某 App 會(huì)記錄用戶的所有點(diǎn)擊行為,并回傳日志(在網(wǎng)絡(luò)不好的情況下,先保存在本地,延后回傳)。
A用戶在 11:01:00?對(duì) App 進(jìn)行操作,B用戶在 11:02:00?操作了 App,
但是A用戶的網(wǎng)絡(luò)不太穩(wěn)定,回傳日志延遲了,導(dǎo)致我們?cè)诜?wù)端先接受到B用戶的消息,然后再接受到A用戶的消息,消息亂序了。
問題:
如果這個(gè)是一個(gè)根據(jù)用戶操作先后順序,進(jìn)行搶購的業(yè)務(wù),那么是A用戶成功還是B用戶成功?
答案:
應(yīng)該算A成功,因?yàn)锳確實(shí)比B操作的早,但是實(shí)際中考慮到實(shí)現(xiàn)難度,可能直接按B成功算
也就是說,實(shí)際開發(fā)中希望基于事件時(shí)間來處理數(shù)據(jù),但因?yàn)閿?shù)據(jù)可能因?yàn)榫W(wǎng)絡(luò)延遲等原因,出現(xiàn)了亂序,按照事件時(shí)間處理起來有難度!
?
???????示例4
在實(shí)際環(huán)境中,經(jīng)常會(huì)出現(xiàn),因?yàn)榫W(wǎng)絡(luò)原因,數(shù)據(jù)有可能會(huì)延遲一會(huì)才到達(dá)Flink實(shí)時(shí)處理系統(tǒng)。我們先來設(shè)想一下下面這個(gè)場景:
原本應(yīng)該被該窗口計(jì)算的數(shù)據(jù)因?yàn)榫W(wǎng)絡(luò)延遲等原因晚到了,就有可能丟失了
?
???????總結(jié)
實(shí)際開發(fā)中我們希望基于事件時(shí)間來處理數(shù)據(jù),但因?yàn)閿?shù)據(jù)可能因?yàn)榫W(wǎng)絡(luò)延遲等原因,出現(xiàn)了亂序或延遲到達(dá),那么可能處理的結(jié)果不是我們想要的甚至出現(xiàn)數(shù)據(jù)丟失的情況,所以需要一種機(jī)制來解決一定程度上的數(shù)據(jù)亂序或延遲到底的問題!也就是我們接下來要學(xué)習(xí)的Watermaker水印機(jī)制/水位線機(jī)制
?
Watermaker水印機(jī)制/水位線機(jī)制
什么是Watermaker?
Watermaker就是給數(shù)據(jù)再額外的加的一個(gè)時(shí)間列
也就是Watermaker是個(gè)時(shí)間戳!
?
???????如何計(jì)算Watermaker?
Watermaker = 數(shù)據(jù)的事件時(shí)間 ?- ?最大允許的延遲時(shí)間或亂序時(shí)間
注意:后面通過源碼會(huì)發(fā)現(xiàn),準(zhǔn)確來說:
Watermaker = 當(dāng)前窗口的最大的事件時(shí)間 ?- ?最大允許的延遲時(shí)間或亂序時(shí)間
這樣可以保證Watermaker水位線會(huì)一直上升(變大),不會(huì)下降
?
???????Watermaker有什么用?
之前的窗口都是按照系統(tǒng)時(shí)間來觸發(fā)計(jì)算的,如: [10:00:00 ~ 10:00:10) 的窗口,
一但系統(tǒng)時(shí)間到了10:00:10就會(huì)觸發(fā)計(jì)算,那么可能會(huì)導(dǎo)致延遲到達(dá)的數(shù)據(jù)丟失!
那么現(xiàn)在有了Watermaker,窗口就可以按照Watermaker來觸發(fā)計(jì)算!
也就是說Watermaker是用來觸發(fā)窗口計(jì)算的!
?
???????Watermaker如何觸發(fā)窗口計(jì)算的?
窗口計(jì)算的觸發(fā)條件為:
- 窗口中有數(shù)據(jù)
- Watermaker >= 窗口的結(jié)束時(shí)間
?
因?yàn)榍懊嬲f到
Watermaker = 當(dāng)前窗口的最大的事件時(shí)間 ?- ?最大允許的延遲時(shí)間或亂序時(shí)間
也就是說只要不斷有數(shù)據(jù)來,就可以保證Watermaker水位線是會(huì)一直上升/變大的,不會(huì)下降/減小的
所以最終一定是會(huì)觸發(fā)窗口計(jì)算的
?
注意:
上面的觸發(fā)公式進(jìn)行如下變形:
Watermaker >= 窗口的結(jié)束時(shí)間
Watermaker = 當(dāng)前窗口的最大的事件時(shí)間 ?- ?最大允許的延遲時(shí)間或亂序時(shí)間
當(dāng)前窗口的最大的事件時(shí)間 ?- ?最大允許的延遲時(shí)間或亂序時(shí)間 ?>= 窗口的結(jié)束時(shí)間
當(dāng)前窗口的最大的事件時(shí)間 ?>= 窗口的結(jié)束時(shí)間 + ?最大允許的延遲時(shí)間或亂序時(shí)間
?
???????圖解Watermaker
?
總結(jié)
以上是生活随笔為你收集整理的2021年大数据Flink(二十二):Time与Watermaker的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年大数据Flink(二十一):
- 下一篇: 2021年大数据Flink(二十三):