Flink - Introducción y uso del disparador Scala/Java

I. Introducción

Flink usa windowAll para generar AllwindowedStream y luego llama a Trigger para ejecutar la lógica de activación de la ventana. Hagamos una comprensión básica de Trigger trigger.

2. Introducción al disparador

Trigger se traduce como disparador, disparador, y su función es disparar la ventana para el cálculo bajo ciertas condiciones. Si es un operador interno, ejecutará el operador correspondiente. Si la implementación personalizada de ProcessAllWindowFunction, activará la lógica de ejecución personalizada. . El activador determina cuándo la ventana (formada por el evaluador de ventana) está lista para ser procesada por la función de ventana. Cada WindowAssigner tiene un activador predeterminado. Si el activador predeterminado no se ajusta a sus necesidades, puede especificar un activador personalizado mediante trigger(...). La activación es más común en la salida en tiempo real de datos de ventana grande. Por ejemplo, para una ventana de 100, los datos se activan cada 10 para ejecutar la lógica de la ventana.

1. Método de activación

· sobreElemento

public abstract TriggerResult onElement(T var1, long var2, W var4, Trigger.TriggerContext var5) throws Exception;

Se llama al método onElement() para cada elemento agregado a la ventana. Tomando el CountTrigger más básico como ejemplo, cada vez que llega un elemento, la clase Trigger correspondiente realizará la acumulación y el juicio del contador.Si el número de llegadas se acumula al recuento correspondiente, se activará y ejecutará una lógica de ventana.

· a la hora del evento

public abstract TriggerResult onEventTime(long var1, W var3, Trigger.TriggerContext var4) throws Exception;

Cuando se activa el temporizador de tiempo del evento registrado, se llama al método onEventTime(). Generalmente, el tiempo de ejecución se restablecerá o se registrará el eventTime de la próxima ejecución después de que se active.

· En Tiempo de Procesamiento

public abstract TriggerResult onProcessingTime(long var1, W var3, Trigger.TriggerContext var4) throws Exception;

Se llama al método onProcessingTime() cuando se activa el temporizador de tiempo de procesamiento registrado. El método de procesamiento básico es el mismo que el anterior.

· onFusionar

public void onMerge(W window, Trigger.OnMergeContext ctx) throws Exception {
    throw new UnsupportedOperationException("This trigger does not support merging.");
}

El método onMerge() está relacionado con activadores con estado, en los que los estados de dos activadores se pueden fusionar cuando se fusionan sus ventanas correspondientes, como cuando se usan ventanas de sesión. Cuando se fusionan dos ventanas, los valores de estado de las dos se fusionan, lo que puede considerarse como una función de reducción, que combina las variables de estado de TimeWindow1 y Timewindow2 en una sola.

· claro

public abstract void clear(W var1, Trigger.TriggerContext var2) throws Exception;

Finalmente, el método clear() hace lo que sea necesario para eliminar la ventana correspondiente. Tomando como ejemplo el CountTrigger más básico, clear borrará el estado del contador, es decir, lo restablecerá a 0.

· puede fusionar

    public boolean canMerge() {
        return false;
    }

Si el activador admite el método onMerge para fusionar los dos estados.

2. Estado de disparo

Los tres métodos de onElement, onProcessTime y onEventTime devolverán un TriggerResult, que es una clase de enumeración y corresponde a la operación de ventana devuelta después de ejecutar el método.

· TriggerResult.CONTINUE - omitir, no hacer nada

TriggerResult.FIRE - cálculo de la ventana de activación

· TriggerResult.PURGE - borra el elemento de la ventana

TriggerResult.FIRE_AND_PURGE : activa una acción de ventana y luego borra el elemento de la ventana

Tomando CountTrigger como ejemplo, cada vez que se acumulen elementos Count, se devolverá TriggerResult.FIRE para ejecutar la lógica de la ventana, y cuando el número Count no sea suficiente, se devolverá TiggerResult.CONTINUE.

3. Flink viene con Trigger

 La clase Flink org.apache.flink.streaming.api.windowing.triggers viene con los siguientes disparadores de ventana. Si necesita personalizar el disparador, solo necesita implementar el método de disparador de la clase Trigger. Por ejemplo, puede combinar CountTrigger y ProcessingTimeTrigger para lograr un disparador CountAndProcessingTime con disparadores duales para el tiempo de conteo y procesamiento.

ContinuousEventTimeTrigger Disparador de tiempo de evento continuo
Disparador de tiempo de procesamiento continuo Procesamiento continuo de disparadores de tiempo
CountTrigger disparador de conteo
Disparador delta Disparador de umbral
EventTimeTrigger disparador de tiempo de evento
ProcessingTimeoutTriggerProcesingTimeoutTrigger Disparador de tiempo de espera de procesamiento
ProcessingTimeTrigger Disparadores de tiempo de procesamiento
Desencadenador de purga Forzar gatillo de PURGA

3. Ejemplo de API

1. Ejemplo de Scala

El siguiente ejemplo agrega el DataStream original en una ventana móvil de 10 segundos, donde Trigger se establece en CountTrigger y se activa cada 30 elementos.

    val allwindowedStream = dataStream
      .windowAll(TumblingProcessingTimeWindows.of(Time.seconds(10)))
      .trigger(CountTrigger.of[TimeWindow](30L))
      .process(new ProcessAllWindowFunction[String, String, TimeWindow] {
        override def process(context: Context, elements: Iterable[String], out: Collector[String]): Unit = {
          val info = elements.toArray.mkString(",")
          out.collect(info)
        }
      }).setParallelism(1)
    allwindowedStream.print()

Consejos:

El parámetro Trigger debe especificar T implícito, que es [TimeWindow] después de. Si se agrega aquí el tipo de salida T de los datos correspondientes, se informará un error Requerido: Trigger[_ >: String,_ >: TimeWindow] :

Required: Trigger[_ >: String,_ >: TimeWindow]
Found: ContinuousProcessingTimeTrigger[String]

2. Ejemplo Java

El siguiente ejemplo genera una ventana móvil de 10 s para el DataStream original y activa la lógica de procesamiento de la ventana cada 5 s de acuerdo con el tiempo de procesamiento continuo, es decir, ProcessFunction.

       dataStream 
           .setParallelism(processParallel)
           .windowAll(TumblingProcessingTimeWindows.of(Time.seconds(10)))
           .trigger(ContinuousProcessingTimeTrigger.of(Time.seconds(5)))
           .process(new ProcessFunction())
           .addSink(outputSink)
           .setParallelism(processParallel)
           .print()

4. Resumen y asuntos que requieren atención

1. Disparador predeterminado

Las ventanas basadas en EventTime usan EventTimeTrigger de manera predeterminada, y las ventanas basadas en ProcessTime usan ProcessingTimeTrigger de manera predeterminada

2.Ventana global

El activador predeterminado de GlobalWindow es NeverTrigger, que nunca se activa. Entonces, al usar GlobalWindow, siempre debe definir un disparador personalizado.

3. Lógica de activación de ventana

Una vez que el activador determina que la ventana está lista para ser procesada, se activa, es decir, devuelve DISPARAR o DISPARAR_Y_PURGAR. Esta es la señal que emite el operador de ventana el resultado de la ventana actual. Dada una ventana con ProcessWindowFunction, todos los elementos se pasan a ProcessWindowFunction. Windows con ReduceFunction o AggregateFunction simplemente envía sus resultados agregados.

4.FUEGO Y PURGA

FUEGO activa la ventana sin borrar los elementos de la ventana, PURGA activa la ventana pero borra los elementos de la ventana. Al editar de forma personalizada, debe prestar atención para evitar perder un lote de datos después de que se active la ventana. En segundo lugar, PURGAR solo borra los elementos de la ventana y algunos metadatos personalizados de la ventana y las propiedades base no se borran.

Supongo que te gusta

Origin blog.csdn.net/BIT_666/article/details/123653502
Recomendado
Clasificación