トリガ(トリガ)
それは窓関数処理によって準備ができたときに、トリガウィンドウが(ディスペンサーが窓によって形成される)が決定されます。各WindowAssignerは、デフォルトのトリガーが付属しています。デフォルトのトリガーがニーズに合わない場合は、カスタム・トリガーを指定する(...)トリガを使用することができます。
トリガトリガ・インタフェースは、5つのメソッドは、トリガーが別のイベントに対応することができますがあります。
-
ウィンドウに各要素のonElement()メソッドを呼び出します。
-
onEventTime()イベント時間タイマトリガが呼び出されます。
-
ときonProcessingTime()の処理時間のタイマートリガーが呼び出されます。
-
onMerge()、状態フリップフロップに関連付けられたフリップフロップと組み合わせた場合に2つの状態は、例えば、会話ウィンドウをそれぞれのウィンドウをマージします。
-
clear()メソッドは、実行ウィンドウを削除することです。
上記の方法について注意するために、2つのこと:
1)最初の3つの方法がTriggerResultを返すことによって、入力イベントを操作する方法を決定します。
CONTINUE:何もしません。
FIRE:トリガー計算。
PURE:ウィンドウのクリア要素。
FIRE_AND_PURE:トリガー・コンピューティングとクリアウィンドウ要素。
2)これらのいずれかの方法は、登録処理タイマーイベントの時間または将来の動作のために使用することができます
火災およびパージ
ウィンドウを決定するために、トリガが処理するための準備ができたら、それはそのリターンの火災やFIRE_AND_PURGEをトリガします。これは、現在のウィンドウの結果を公表した信号ウィンドウ演算子です。すべての要素がProcessWindowFunctionを通過しているとProcessWindowFunctionに窓を考えると(後にそれらを渡すことによって追い出さすることができます)。Windowsのみ彼らの緊急の重合結果を出すReduceFunction、AggregateFunctionまたはFoldFunctionを持っています。
トリガーがトリガーされると、それは、火災やFIRE_AND_PURGEことができます。同時にFIREはFIRE_AND_PURGEは、その内容を削除、ウィンドウの内容を保持しています。デフォルトでは、プリトリガートリガーFIREの実現だけで、ウィンドウの状態をクリアしません。
注意⚠️:
清除将仅删除窗口的内容,并将保留有关该窗口的任何潜在元信息以及任何触发状态。
デフォルトのトリガー
多くのユースケースに適したWindowAssignerのデフォルトのトリガー。たとえば、すべてのイベントは、デフォルトのトリガーとして時間分配EventTimeTriggerの窓を有しています。ウィンドウの終わりまでにウォーターマークたら、トリガがトリガされます。
注意⚠️:
GlobalWindow的默认触发器是NeverTrigger,它从不触发。因此,在使用GlobalWindow时,您始终必须定义一个自定义触发器。
通过使用trigger()指定触发器,您将覆盖WindowAssigner的默认触发器。例如,如果为TumblingEventTimeWindows指定CountTrigger,
则将不再基于时间进度而是仅通过计数来获取窗口触发。现在,如果要基于时间和计数做出反应,则必须编写自己的自定义触发器。
内蔵およびカスタム・トリガー
FLINKは、一部は内蔵されたトリガ。
-
時間ベースのイベントや透かし窓機構の計算をトリガするEventTimeTrigger。
-
ProcessingTimeTriggerトリガは処理時間に基づいて。
-
要素のCountTriggerの数が限界値が計算をトリガーする設定、予め定義されたウィンドウを超えます。
-
パージフリップフロップに変換した他のトリガのパラメータとしてPurgingTrigger。
カスタム・トリガーを実装する必要がある場合は、トリガークラスを実現しなければなりません。、APIはまだ発展途上であり、FLINKの将来のバージョンで変更される可能性がありますのでご注意ください。
import org.apache.flink.streaming.api.windowing.triggers.Trigger;
import org.apache.flink.streaming.api.windowing.triggers.TriggerResult;
import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
/**
* <p/>
* <li>title: DataStream 触发器</li>
* <li>@author: li.pan</li>
* <li>Date: 2019/12/29 5:00 下午</li>
* <li>Version: V1.0</li>
* <li>Description: 自定义元素个数触发器</li>
*/
public class CustomProcessingTimeTrigger extends Trigger<Object, TimeWindow> {
private static final long serialVersionUID = 1L;
private CustomProcessingTimeTrigger() {}
private static int flag = 0;
@Override
public TriggerResult onElement(Object element, long timestamp, TimeWindow window, TriggerContext ctx) {
ctx.registerProcessingTimeTimer(window.maxTimestamp());
// CONTINUE是代表不做输出,也即是,此时我们想要实现比如100条输出一次,
// 而不是窗口结束再输出就可以在这里实现。
if(flag > 9){
flag = 0;
return TriggerResult.FIRE;
}else{
flag++;
}
System.out.println("onElement : "+element);
return TriggerResult.CONTINUE;
}
@Override
public TriggerResult onEventTime(long time, TimeWindow window, TriggerContext ctx) throws Exception {
return TriggerResult.FIRE_AND_PURGE;
}
@Override
public TriggerResult onProcessingTime(long time, TimeWindow window, TriggerContext ctx) {
return TriggerResult.FIRE_AND_PURGE;
}
@Override
public void clear(TimeWindow window, TriggerContext ctx) throws Exception {
ctx.deleteProcessingTimeTimer(window.maxTimestamp());
}
@Override
public boolean canMerge() {
return true;
}
@Override
public void onMerge(TimeWindow window, OnMergeContext ctx) {
// only register a timer if the time is not yet past the end of the merged window
// this is in line with the logic in onElement(). If the time is past the end of
// the window onElement() will fire and setting a timer here would fire the window twice.
long windowMaxTimestamp = window.maxTimestamp();
if (windowMaxTimestamp > ctx.getCurrentProcessingTime()) {
ctx.registerProcessingTimeTimer(windowMaxTimestamp);
}
}
@Override
public String toString() {
return "ProcessingTimeTrigger()";
}
/**
* 创建一个自定义触发器对象
*/
public static CustomProcessingTimeTrigger create() {
return new CustomProcessingTimeTrigger();
}
}