Flink disparador disparadores

Triggers (disparadores)

se determina la ventana de activación (el dispensador está formado por la ventana) cuando está listo por el procesamiento de función de ventana. Cada WindowAssigner viene con un disparador por defecto. Si el gatillo por defecto no se ajusta a sus necesidades, puede utilizar el gatillo (...) para especificar un disparador personalizado.

interfaz del gatillo de disparo tiene cinco métodos permiten el gatillo para responder a diferentes eventos:

  • onElement () para cada elemento en la ventana llamará al método.

  • Cuando onEventTime () disparador del temporizador hora del evento se llama.

  • Cuando onProcessingTime () será llamado gatillo temporizador de tiempo de procesamiento.

  • onMerge () asociado con un flip-flop estado, flip-flops y dos estados fusionar sus respectivas ventanas cuando se combina, por ejemplo, una ventana de conversación.

  • método clear () es borrar la ventana de ejecución.

Dos cosas a tener en cuenta sobre el método anterior:

1). Los tres primeros métodos para determinar cómo operar el evento de entrada, devolviendo una TriggerResult.

El CONTINUAR : no hacer nada.

FUEGO : cálculo gatillo.

PURE : claros elementos de la ventana.

FIRE_AND_PURE : disparador de la informática y elementos de ventanas transparentes.

2). El método de una cualquiera de éstos puede ser utilizado para la operación de futuro de tiempo de procesamiento de registro de la evento de temporizador o

Fuego y purga

Una vez que el gatillo para determinar la ventana está listo para su procesamiento, se disparará que vuelve el fuego o FIRE_AND_PURGE. Este es el operador ventana de señal emitida los resultados de la ventana actual. Dada ProcessWindowFunction una ventana con todos los elementos se pasan a través de la ProcessWindowFunction (puede ser desalojado por pasarlos a más adelante). Windows tiene ReduceFunction, AggregateFunction o FoldFunction El único problema sus resultados de polimerización urgentes.

Cuando se acciona el gatillo, puede ser un incendio o FIRE_AND_PURGE. FUEGO, al mismo tiempo retener el contenido de la ventana, FIRE_AND_PURGE borrar su contenido. Por defecto, la realización del disparo del gatillo de disparo pre-solamente, y no se borra el estado de ventana.

注意⚠️:
清除将仅删除窗口的内容,并将保留有关该窗口的任何潜在元信息以及任何触发状态。

Los disparadores predeterminados

WindowAssigner de disparo por defecto adecuado para muchos casos de uso. Por ejemplo, todos los eventos tienen una ventana de EventTimeTrigger distribuidor de tiempo como el disparador por defecto. Una vez WaterMark por el final de la ventana, el gatillo se dispara.

注意⚠️:
GlobalWindow的默认触发器是NeverTrigger,它从不触发。因此,在使用GlobalWindow时,您始终必须定义一个自定义触发器。
通过使用trigger()指定触发器,您将覆盖WindowAssigner的默认触发器。例如,如果为TumblingEventTimeWindows指定CountTrigger,
则将不再基于时间进度而是仅通过计数来获取窗口触发。现在,如果要基于时间和计数做出反应,则必须编写自己的自定义触发器。

Incorporado y disparadores personalizados

Flink tiene algunas de ellas construidas en gatillo.

  • EventTimeTrigger para activar el cálculo de eventos basados ​​en el tiempo y mecanismo de la ventanilla marca de agua.

  • ProcessingTimeTrigger gatillo basa en el tiempo de procesamiento.

  • número CountTrigger de elementos excede una ventana predefinida, a continuación, establezca los valores límite activarán cálculo.

  • PurgingTrigger como un parámetro de la otra de disparo, que se convirtió en una purga flip-flop.

Si es necesario implementar un disparador personalizada, debe darse cuenta de la clase de disparo. Atención: API sigue evolucionando y puede cambiar en futuras versiones de 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();
    }

}

 

 

Publicado 87 artículos originales · ganado elogios 69 · vistas 130 000 +

Supongo que te gusta

Origin blog.csdn.net/lp284558195/article/details/103802738
Recomendado
Clasificación