Flink晚到的數據怎麼更新之前窗口計算的結果

最近有一個朋友問我,Flink使用窗口計算的時候,如果設置了允許數據晚到時間,這個時候又來了一條屬於前面窗口的數據,但是前面窗口的計算結果已經寫到mysql了,怎麼更正之前的結果,而不是在寫入一條數據呢?今天這篇文章就來介紹一下怎麼使用Flink的窗口函數更新之前計算的不完全的(不準確的結果)

對於晚到的數據,一般有幾種常用的處理方式:

 

1,直接丟棄掉(這個也是窗口的默認做法,也就是說一個遲到的元素不會創建一個新的窗口)

2,用測流輸出的方式,拿到晚到的元素,可以進行,相關的邏輯處理,或者保存起來.

3,更新之前的窗口計算結果,也就是今天要介紹的做法.

 

由於存在晚到的元素,所以已經計算出的窗口結果是不準確和不完全的。我們可以使用遲到元素更新已經計算完的窗口結果。

如果我們要求一個operator支持重新計算和更新已經發出的結果,就需要在第一次發出結果以後也要保存之前所有的狀態。但顯然我們不能一直保存所有的狀態,肯定會在某一個時間點將狀態清空,而一旦狀態被清空,結果就再也不能重新計算或者更新了。而遲到的元素只能被拋棄或者發送到側輸出流。

window operator API提供了方法來明確聲明我們要等待遲到元素。當使用event-time window,我們可以指定一個時間段叫做allowed lateness。window operator如果設置了allowed lateness,這個window operator在水位線沒過窗口結束時間時也將不會刪除窗口和窗口中的狀態。窗口會在一段時間內(allowed lateness設置的)保留所有的元素。

當遲到元素在allowed lateness時間內到達時,這個遲到元素會被實時處理併發送到觸發器(trigger)。當水位線沒過了窗口結束時間+allowed lateness時間時,窗口會被刪除,並且所有後來的遲到的元素都會被丟棄。

 

首先來看一下具體的代碼實現:

package flink.window

import j
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章