天天看點

[Flink]Flink1.3 Stream指南七 了解事件時間與Watermarks

Flink實作了資料流模型(Dataflow Model)中許多技術。如果想對事件時間(event time)和水位線(watermarks)更詳細的了解,請參閱下面的文章:

支援事件時間的流處理器需要一種方法來衡量事件時間的進度。例如,一個建構按小時處理視窗的視窗算子,當事件時間超過一小時末尾時需要被通知(a window operator that builds hourly windows needs to be notified when event time has passed beyond the end of an hour),以便操作員可以關閉正在進行的視窗。

事件時間可以獨立于處理時間來運作。例如,在一個程式中,算子(operator)的目前事件時間可以略微落後于處理時間(考慮接收事件的延遲),而兩者以相同的速度繼續前行。另一方面,另一個流式處理程式可以運作幾個星期的事件時間,但是處理隻需幾秒鐘(another streaming program might progress through weeks of event time with only a few seconds of processing),通過快速轉發已經在Kafka Topic中緩沖的一些曆史資料。

Flink中測量事件時間進度的機制是水位線(watermarks)。水位線作為資料流的一部分流動,并攜帶時間戳t。

Watermark(t)

聲明在資料流中事件時間已達到時間t,這意味着流不再有時間戳t'<= t(即時間戳老于或等于水印的事件)的元素。

下圖顯示了具有時間戳(邏輯上)和内嵌watermark的事件流。在這個例子中,事件是順序的(相對于它們的時間戳),這意味着水位線隻是資料流中的周期性标記。

[Flink]Flink1.3 Stream指南七 了解事件時間與Watermarks

watermark對于亂序資料流至關重要,如下圖所示,事件并未按照時間戳進行排序。通常,watermark是資料流中一個點的聲明,到達某一時間戳的所有事件都應該已經到達這一點(watermark is a declaration that by that point in the stream, all events up to a certain timestamp should have arrived)。一旦watermark達到算子,算子就可以将其内部的事件時間時鐘提前到watermark的值。

[Flink]Flink1.3 Stream指南七 了解事件時間與Watermarks

1. 資料流中的并行Watermarks http://gitlab.corp.qunar.com/jifeng.si/learningnotes/blob/master/IT/%E5%A4%A7%E6%95%B0%E6%8D%AE/Flink/%5BFlink%5DFlink1.3%20Stream%E6%8C%87%E5%8D%97%E4%B8%83%20%E7%90%86%E8%A7%A3%E4%BA%8B%E4%BB%B6%E6%97%B6%E9%97%B4%E4%B8%8EWatermarks.md#1-watermarks

watermarks是直接通過源函數(source functions)生成的或在源函數之後生成的。源函數的每個并行子任務通常獨立生成watermarks。這些watermarks在該特定并行源中定義事件時間。

watermarks貫穿整個流處理程式,他們會在到達的算子處将事件時間提前(they advance the event time at the operators where they arrive)。無論算子提前事件時間到何時,它都會為下遊的後續算子生成一個新的watermarks(Whenever an operator advances its event time, it generates a new watermark downstream for its successor operators.)。

一些算子消耗多個輸入流;union操作,例如後面跟着keyBy(...)函數或者partition(...)函數。這樣的算子的目前事件時間是其輸入流的事件時間的最小值。由于輸入流更新了事件時間,是以算子也是如此。

下圖顯示了流過并行流的事件和watermarks的示例,以及跟蹤事件時間的算子:

[Flink]Flink1.3 Stream指南七 了解事件時間與Watermarks

2. 延遲元素 http://gitlab.corp.qunar.com/jifeng.si/learningnotes/blob/master/IT/%E5%A4%A7%E6%95%B0%E6%8D%AE/Flink/%5BFlink%5DFlink1.3%20Stream%E6%8C%87%E5%8D%97%E4%B8%83%20%E7%90%86%E8%A7%A3%E4%BA%8B%E4%BB%B6%E6%97%B6%E9%97%B4%E4%B8%8EWatermarks.md#2

某些元素可能違反watermarks條件,這意味着即使在

watermarks(t)

發生之後,還是會出現很多的時間戳t'<= t的元素。事實上,在現實世界的許多設定中,某些元素可以被任意地延遲,是以指定一個時間,在這個時間内所有在一個特定事件時間戳的事件都會發生是不可能的(making it impossible to specify a time by which all elements of a certain event timestamp will have occurred)。 此外,即使延遲可以被限制,但通常也不希望延遲太多的watermarks,因為它在事件時間視窗的評估中導緻太多的延遲。

是以,流處理程式中可能會明确地指定一些延遲元素。延遲元素是在系統的事件時鐘(由水印發出信号)之後已經通過了延遲元素時間戳的時間之後到達的元素(Late elements are elements that arrive after the system’s event time clock (as signaled by the watermarks) has already passed the time of the late element’s timestamp.)。 有關如何處理事件時間視窗中的晚期元素的更多資訊,請參閱允許的延遲。

3. 調試Watermarks http://gitlab.corp.qunar.com/jifeng.si/learningnotes/blob/master/IT/%E5%A4%A7%E6%95%B0%E6%8D%AE/Flink/%5BFlink%5DFlink1.3%20Stream%E6%8C%87%E5%8D%97%E4%B8%83%20%E7%90%86%E8%A7%A3%E4%BA%8B%E4%BB%B6%E6%97%B6%E9%97%B4%E4%B8%8EWatermarks.md#3-watermarks

請參閱

調試Windows和事件時間

部分,以便在運作時調試Watermarks。

原文:

https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/event_time.html#event-time-and-watermarks

繼續閱讀