理解Flink之二Window與Watermark


Flnk作為流式計算平台,他能對源源不斷發送過來的數據進行處理。
對於數據流的處理方式,可以是來一條處理一條(pipeline的方式),還可以獲取一些數據然后統一處理。
對於數據流如何描述一堆數據呢?就是通過Window的概念。

Window

Window翻譯為窗口,相當於將流式數據進行邏輯切割,那么可以將Window內的數據看成一個整體。我們就可以對Window內的數據進行聚合、排序等操作。
對於流式數據來說,划分Window的方式必然和Time有關。在Flink中Window分為兩種TimeWindow和GlobalWindow。TimeWindow包含起始時間,GlobalWindow是沒有結束時間的TimeWindow。其實你也可以理解為只有一種Window。

划分Window不是目的,目的是能對Window中的數據進行處理。
那么,我們需要知道Window中的數據什么時候采集結束?所以在Window的操作中需要設置trigger,當Window中的數據滿足某個條件時觸發trigger,表示Window中的數據已經采集完了,開始下面的計算吧。
方式可以有:

  • CountTrigger window中事件數量達到某個值時觸發計算
  • EventTimeTrigger window中包含某個時間點的事件時觸發計算
    ...

對於,數據到底應該進入哪個Window(有可能一條數據可以進入多個Window)?Flink中通過設置WindowAssigner來實現。其實就是如何划分時間軸。

  • GlobalWindows 表示 整個流為一個整體的Window
  • TumblingEventTimeWindows 表示 兩兩Window緊密相連
  • SlidingEventTimeWindows 表示 有交集的Window
    ...

Flink中還為Window添加了一種操作,當觸發計算后,你可以刪除Window中的某些事件。這個需求可以通過設定Evictor來實現。

這就是Flink中對於Window的操作。

Watermark

那Watermark的作用呢?

在流式數據中日志不斷的進入Flink系統,在Flink中定義了三種時間:EventTime、IngestTime、ProcessTime。

  • EventTime 表示日志中自帶的時間
  • IngestTime 表示日志進入Flink系統的時間
  • ProcessTime 表示Flink處理日志的時間

在上面Window中說道,Window是基於時間對日志進行邏輯切割,那么時間以什么為基准呢?在Flink系統中可以通過設置上述的時間來確定基准時間,默認是ProcessTime。
雖然有三種時間但是EventTime和IngestTime/ProcessTime有一個很大的區別,對於Flink系統來說IngestTime/ProcessTime一定是有序的,而EventTime而不一定(大概率是亂序的)。

那么當我們以EventTime為基准來分割Window時,則可能就會出現原本是Window A中的數據,而在Window D時才進入Flink系統(認為在時間上Window A比Window D早)。
如果我們希望晚到的數據也能進入在本來應該進入的Window A中去呢?這時候Flink設計了Watermark來解決這個問題。
Watermark實現的功能是用戶通過設置Watermark的生成規則來手工的指定何時觸發Window計算。
常用的方式是讓Watermark延時一段時間生成。這也可以將Window之外的一部分日志也計入該Window。但是,這個預估的延時不能完美的解決亂序的問題。

所以Watermark是在當基准時間設置為EventTime時解決日志亂序的工具。

引用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM