1、什么是觸發器
觸發器決定了一個窗口何時可以被窗口函數處理(條件滿足時觸發並發出信號)
每一個WindowAssigner都有一個默認的觸發器,如果默認的觸發器不能滿足你的需要,你可以通過調用trigger(...)來指定一個自定義的觸發器
觸發器有5個方法來允許觸發器處理不同的事件(Trigger):
onElement()方法:每個元素被添加到窗口時調用
onEventTime()方法:當一個已注冊的事件時間計時器啟動時調用
onProcessingTime()方法:當一個已注冊的處理時間計時器啟動時調用
onMerge()方法:與狀態性觸發器相關,當使用session window時,兩個觸發器對應的窗口合並時,合並兩個觸發器的狀態。
clear() 相應窗口被清除時觸發
前三個方法通過返回TriggerResult來決定如何對其調用事件進行操作。該操作可以是以下操作之一:
CONTINUE:什么也不做
FIRE:觸發計算
PURGE:清除窗口中的數據
FIRE_AND_PURGE:觸發計算並隨后清除窗口中的元素
2、觸發和清除(Fire and Purge)
一旦一個觸發器決定一個窗口已經准備好進行處理,它將觸發並返回FIRE或者FIRE_AND_PURGE。這是窗口操作發送當前窗口結果的信號,發送給一個帶有ProcessWindowFunction的窗口,所有元素都被傳遞給ProcessWindowFunction(可能在將它們傳遞給回收器之后)。
信號發送給具有ReduceFunction、AggregateFunction或FoldFunction的窗口只發出它們聚合的結果。
當一個觸發器觸發時,它可以是FIRE或者FIRE_AND_PURGE,如果是FIRE的話,將保持window中的內容,FIRE_AND_PURGE的話會清除window的內容。默認情況下,預實現的觸發器僅僅是FIRE,不會清除window的狀態。
注意:清除操作僅清除window的內容,並留下潛在的窗口元信息和完整的觸發器狀態。
3、默認觸發器
每一個窗口分配器都有一個默認的觸發器
WindowAssigner的默認觸發器覆蓋了很多場景(基本夠用了)。
例如,所有event-time window assigner都有一個EventTimeTrigger作為默認觸發器。只要水印通過窗口的末端,這個觸發器就會觸發。
GlobalWindow的默認觸發器是永不觸發的NeverTrigger。因此在使用GlobalWindow時,必須定義一個自定義觸發器。
通過使用trigger()指定觸發器,將覆蓋WindowAssigner的默認觸發器。例如,如果你為TumblingEventTimeWindows指定了CountTrigger,那么將不再根據時間的進度獲得窗口觸發,而只根據計數。如果希望根據時間和計數進行響應,就必須編寫自己的觸發器。
4、內置和自定義觸發器
4.1、Flink內置的觸發器:
EventTimeTrigger(前面提到過) 根據由watermark衡量的Event Time進度來觸發
ProcessingTimeTrigger 根據處理時間來觸發
CountTrigger 一旦窗口中的元素個數超出了給定的限制就會觸發
PurgingTrigger 接受另一個觸發器作為參數,並將其轉換為一個purging觸發器(當嵌套觸發器觸發時,將返回FIRE_AND_PURGE類型的TriggerResult)
4.2、自定義觸發器
實現Trigger