Trigger確定視窗(由視窗分配器形成)何時準備好由視窗函數處理。每個WindowAssigner都帶有一個預設值Trigger。如果預設觸發器不符合您的需求,您可以使用trigger(…)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
一旦觸發器確定視窗已準備好進行處理,就會觸發,返回狀態可以是FIRE或FIRE_AND_PURGE。其中FIRE是觸發視窗計算並保留視窗內容,而FIRE_AND_PURGE是觸發視窗計算並刪除視窗內容。預設情況下,預實現的觸發器只是簡單地FIRE不清除視窗狀態。
EventTimeTrigger:透過比較EventTime和視窗的Endtime決定是否觸發視窗計算,如果EventTime大於Window EndTime觸發,否則不觸發,視窗將繼續等待。
ProcessTimeTrigger:透過比較ProcessTime和視窗EndTme確定是否觸發窗口,如果ProcessTime大於EndTime則觸發計算,否則窗口繼續等待。
ContinuousEventTimeTrigger:根據間隔時間週期性觸發視窗或Window的結束時間小於目前EndTime觸發視窗計算。
ContinuousProcessingTimeTrigger:根據間隔時間週期性觸發視窗或Window的結束時間小於目前ProcessTime觸發視窗計算。
CountTrigger:根據存取資料量是否超過設定的闕值判斷是否觸發視窗計算。
DeltaTrigger:根據存取資料計算出來的Delta指標是否超過指定的Threshold去判斷是否觸發視窗計算。
PurgingTrigger:可以將任意觸發器作為參數轉換為Purge類型的觸發器,計算完成後資料將會被清理。
NeverTrigger:任何時候都不觸發視窗運算
#主要看看EventTimeTrigger和ProcessingTimeTrigger的原始碼。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
在onElement()方法中,ctx.registerProcessingTimeTimer(window.maxTimestamp())將會註冊一個ProcessingTime計時器,時間Processing參數是window.maxTimestamp(),也就是視窗的最終時間,當時間到達這個視窗最終時間,計時器觸發並呼叫onProcessingTime()方法,在onProcessingTime() 方法中,return TriggerResult.FIRE 即傳回FIRE,觸發視窗中資料的計算,但是會保留視窗元素。
要注意的是ProcessingTimeTrigger類別只會在視窗的最終時間到達的時候觸發視窗函數的計算,計算完成後並不會清除視窗中的數據,這些資料儲存在記憶體中,除非呼叫PURGE或FIRE_AND_PURGE,否則資料將一直存在記憶體中。實際上,Flink中提供的Trigger類,除了PurgingTrigger類,其他的都不會對視窗中的資料進行清除。
1 2 3 4 5 6 |
|
TumblingProcessingTimeWindows :ProcessingTimeTrigger
1 2 3 4 5 |
|
1 2 3 4 5 6 |
|
SlidingProcessingTimeWindows :ProcessingTimeTrigger
1 2 3 4 5 |
|
1 2 3 4 5 6 |
|
ProcessingTimeSessionWindows:ProcessingTimeTrigger
1 2 3 4 5 |
|
1 2 3 4 5 6 |
|
以上是Java Flink視窗觸發器Trigger怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!