一、數(shù)據(jù)為什么會亂序?
在了解為什么會亂序之前我們先來看一下在Flink中的時間語序。
1.1? Flink Time? 時間語義
-
Event Time:事件產(chǎn)生的時間,它通常由事件中的時間戳描述。
-
Ingestion Time:事件進(jìn)入Flink的時間。
-
Processing Time:事件被處理時當(dāng)前系統(tǒng)的時間。
這三種時間的對應(yīng)關(guān)系如下圖所示:
1.2? 數(shù)據(jù)亂序的產(chǎn)生
在使用EventTime處理Stream數(shù)據(jù)的時候就會遇到數(shù)據(jù)亂序的問題。流處理從Event(事件)產(chǎn)生,流經(jīng)Source,再到Operator,這中間需要一定的時間。雖然大部分情況下,傳輸?shù)絆perator的數(shù)據(jù)都是按照Event Time順序來的,但是也不排除因為網(wǎng)絡(luò)延遲等原因?qū)е聛y序的產(chǎn)生。特別是使用kafka的時候,多個分區(qū)間無法保證數(shù)據(jù)的有序性。
那么Flink針對亂序數(shù)據(jù)是如何處理的呢?
二、Flink是如何處理亂序數(shù)據(jù)的?
故事時間到~????
學(xué)校準(zhǔn)備春游,春游是大家小時候最愛的活動了。
小明班計劃的發(fā)車時間是09:00~09:10。
但是老師怕有同學(xué)遲到,趕不上一年一次的春游,所以讓司機大叔把他自己的表的時間調(diào)慢了五分鐘。(這樣實際發(fā)車時間是09:05~09:15)
果然早上的時候?qū)W校附近有條路突然開始維修,導(dǎo)致部分同學(xué)在規(guī)定時間內(nèi)無法到達(dá),不過還好老師有先見之明,讓司機大叔將表調(diào)慢了五分鐘,九點十五前陸陸續(xù)續(xù)到了一部分。
不過還是有小部分同學(xué)沒能在五分鐘內(nèi)趕到,也不能一直等著,所以老師便和司機大叔說先走但是前三分鐘開慢點,讓那些小部分已經(jīng)快趕到的同學(xué)打車追過來,這樣就也能上車了。
但總有一些家賊遠(yuǎn),或者路上堵住了等各種問題,導(dǎo)致又過了三分鐘還是沒追上,可是也不能不讓人家參加春游,畢竟一年一次,所以學(xué)校安排了備用車,送這些晚到很久的同學(xué)。最后,同學(xué)們都愉快的玩耍了起來。
總結(jié):
故事中的班車:同一個班級上同一輛班車,對應(yīng)的就是流式計算的窗口。
2.1 ?Flink為什么需要窗口計算?
我們知道在Flink的世界觀中一切都是由流組成的,離線的數(shù)據(jù)是有界流,實時的數(shù)據(jù)是無界流。我們需要的是通過計算數(shù)據(jù)匯總產(chǎn)生結(jié)果。就算是有界流也不可能一直等數(shù)據(jù),所以無論是有界流還是無界流就都需要規(guī)劃一個范圍來進(jìn)行計算,這就是所謂的窗口。
窗口就是將無界流或者大的有界流切割成小的有界流的一種方式,它會將數(shù)據(jù)分發(fā)到有限大小的桶中進(jìn)行分析。
2.2 Flink中的窗口
-
時間窗口(Time Window)
-
滾動時間窗口
-
滑動時間窗口
-
會話窗口
-
計數(shù)窗口 (Count Window)
-
滾動計數(shù)窗口
-
滑動計數(shù)窗口
2.2.1 滾動窗口
-
將數(shù)據(jù)依據(jù)固定的窗口長度進(jìn)行切分;
-
時間對齊,窗口長度固定,沒有重疊。
2.2.2 滑動窗口
-
滑動窗口是固定窗口的更廣義的一種形式,滑動窗口由固定的窗口長度和滑動間隔組成;
-
窗口長度固定,可以有間隔。
2.2.3 會話窗口
-
由一系列事件組合一個特定時間長度的timeout間隙組成,也就是一段時間沒有接收到新數(shù)據(jù)就會生成新的窗口;
-
時間無對齊。
2.3 如何進(jìn)行窗口計算?
進(jìn)行窗口計算,我們至少需要知道兩個條件:
-
數(shù)據(jù)的產(chǎn)生時間即 EventTime?
-
在窗口內(nèi)的數(shù)據(jù),何時觸發(fā)計算?
第一點很好解決,只需要在數(shù)據(jù)產(chǎn)生的時候?qū)r間戳帶過來就可以了。那么第二點,F(xiàn)link是如何判斷何時觸發(fā)窗口計算的呢?并且第一個窗口是什么時候生成的呢?
在回答這個問題之前,讓我們先來看一下以下三點:
2.3.1 有序事件
理想情況下,數(shù)據(jù)都是嚴(yán)格有序的,那么這個時候流式計算引擎選定窗口時間后,是可以正確的將窗口內(nèi)的數(shù)據(jù)計算出來的。然而理想很豐滿,現(xiàn)實很骨感,現(xiàn)實中的數(shù)據(jù)往往都存在亂序的情況。
2.3.2 無序事件
剛剛已經(jīng)知道了數(shù)據(jù)必然存在亂序的可能,因此Flink需要有一種機制能讓遲到的數(shù)據(jù)放在對應(yīng)的窗口中進(jìn)行計算。
還記得故事中,老師讓司機大叔將自己的表調(diào)慢五分鐘嗎?對應(yīng)的就是這種機制 Watermark -- 水位線。
2.3.3 Watermark -- 水位線
特點:
-
Watermark 是一個特殊的數(shù)據(jù),本質(zhì)上就是一個時間戳;
-
Watermark 必須單調(diào)遞增,以確保任務(wù)的事件時間時鐘一直在往前推進(jìn);
-
Watermark 與數(shù)據(jù)的時間戳有關(guān)。
為什么Watermark 能解決問題?
-
Watermark是一種告訴Flink一個消息延遲多少的方式,它定義了從什么時候開始可以不再等待更早的數(shù)據(jù);
-
可以把Watermarks理解為一個水位線,這個Watermarks在不斷地變化。Watermark實際上作為數(shù)據(jù)流的一部分隨數(shù)據(jù)流流動;
-
當(dāng)Flink中的運算符接收到Watermarks時,它明白早于該時間的消息已經(jīng)完全抵達(dá)計算引擎,即假設(shè)不會再有時間小于水位線的事件到達(dá);
-
這個假設(shè)是觸發(fā)窗口計算的基礎(chǔ),只有水位線越過窗口對應(yīng)的結(jié)束時間,才會觸發(fā)窗口計算操作。
下圖詳解了watermark的工作流程:
如何防止數(shù)據(jù)丟失?
如果說故事中司機大叔故意將表調(diào)慢五分鐘,對應(yīng)的Flink設(shè)置水位線是防止數(shù)據(jù)短時間內(nèi)錯亂是第一道保險的話,那么老師讓司機大叔開車后的前三分鐘開慢點讓后面的同學(xué)可以坐出租車追上,對應(yīng)的就是Flink可以設(shè)置延遲時間,在延遲時間內(nèi)(也就是數(shù)據(jù)的watermark時間)亂序數(shù)據(jù)可以再次進(jìn)入對應(yīng)的窗口進(jìn)行計算便是Flink防止數(shù)據(jù)亂序的第二道保險。
?如果還有更晚到的數(shù)據(jù)呢?
對于實時數(shù)據(jù),我們不好肯定可容錯的水位線以及延遲時間可以防止所有晚到的數(shù)據(jù)進(jìn)入窗口計算。
從性能,從實時性考慮我們都不能將水位線或者延遲時間拉得太長。
水位線與延遲時間的設(shè)置只能是開發(fā)人員基于業(yè)務(wù),數(shù)據(jù)量,亂序的范圍等綜合考慮,是在不過多影響性能,實時性的前提下設(shè)計的。
那么更晚到的數(shù)據(jù)怎么辦呢?
就如同剛剛的故事中,學(xué)校讓更晚到的同學(xué)坐另一輛車去目的地一樣,F(xiàn)link對于更晚到的亂序數(shù)據(jù)的處理就是,將他們統(tǒng)一放入側(cè)輸出流中讓開發(fā)人員自行處理。
三、總結(jié)
-
通過 assignTimestampsAndWatermarks 來設(shè)置水位線時間,讓短時間內(nèi)大量遲到的數(shù)據(jù)可以進(jìn)入對應(yīng)的窗口,當(dāng)水位線時間漫過窗口時間,開始觸發(fā)窗口操作。
-
通過 allowedLateness 來設(shè)置延遲時間,讓在延遲時間內(nèi)遲到的數(shù)據(jù)可以進(jìn)入窗口計算。
-
通過 sideOutputLateData 來設(shè)置側(cè)輸出流進(jìn)行兜底,讓更晚到的數(shù)據(jù)進(jìn)入側(cè)輸出流中。
Flink最終就是用這一套組合拳來處理亂序數(shù)據(jù)的。? ? ?
Flink不同操作是可以分區(qū)的,那么在分區(qū)時watermark是如何傳遞的呢?大家可以結(jié)合實踐好好思考下~文章來源:http://www.zghlxwxcb.cn/news/detail-730213.html
本期內(nèi)容就到這里了,如果喜歡就點個關(guān)注吧,微信公眾號搜索“數(shù) 新 網(wǎng) 絡(luò) 科 技 號”可查看更多精彩內(nèi)容~文章來源地址http://www.zghlxwxcb.cn/news/detail-730213.html
到了這里,關(guān)于Flink之?dāng)?shù)據(jù)亂序處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!