Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Actualización más reciente 2023-04-14 GMT+08:00

Ventana

Función de código abierto mejorada: Ventana

Esta sección describe la ventana deslizante de Flink y proporciona el método de optimización de ventana deslizante. Para obtener más información sobre ventanas, visite el sitio web oficial en https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/stream/operators/windows.html.

Introducción a ventana

Los datos de una ventana se guardan como resultados intermedios o como datos originales. Si realiza una operación de suma (window(SlidingEventTimeWindows.of(Time.seconds(20), Time.seconds(5))).sum) en los datos de la ventana, solo se conservará el resultado intermedio. Si se utiliza una ventana personalizada (window(SlidingEventTimeWindows.of(Time.seconds(20), Time.seconds(5))).apply(new UDF)), se guardarán todos los datos originales de la ventana.

Si se utilizan SlidingEventTimeWindow y SlidingProcessingTimeWindow de ventanas personalizadas, los datos se guardan como múltiples copias de respaldo. Supongamos que la ventana se define de la siguiente manera:

window(SlidingEventTimeWindows.of(Time.seconds(20), Time.seconds(5))).apply(new UDFWindowFunction)

Si llega un bloque de datos, se asigna a cuatro ventanas diferentes (20/5 = 4). Es decir, los datos se guardan como cuatro copias en la memoria. Cuando el tamaño de la ventana o el período de deslizamiento se establece en un valor grande, los datos se guardarán como copias excesivas, lo que causa redundancia.

Figura 1 Estructura original de una ventana

Si un bloque de datos llega al segundo 102, se asigna a las ventanas [85, 105), [90, 110), [95, 115) y [100, 120).

Optimización de Window

Como se mencionó en lo anterior, hay copias de datos excesivas cuando los datos originales se guardan en el SlidingEventTimeWindow y el SlidingProcessingTimeWindow. Para resolver este problema, se reestructura la ventana que almacena los datos originales, lo que optimiza el almacenamiento y reduce considerablemente el espacio de almacenamiento. El esquema de optimización de ventanas es el siguiente:

  1. Utilice el período deslizante como una unidad para dividir una ventana en diferentes paneles.

    Una ventana consta de uno o varios paneles. Un panel es esencialmente un período deslizante. Por ejemplo, el período deslizante (es decir, el panel) de window(SlidingEventTimeWindows.of(Time.seconds(20), Time.seconds.of(5))) dura 5 segundos. Si esta ventana oscila entre [100, 120), esta ventana se puede dividir en paneles [100, 105), [105, 110), [110, 115) y [115, 120).

    Figura 2 Optimización de ventanas
  2. Cuando llega un bloque de datos, no se asigna a una ventana específica. En su lugar, Flink determina el panel al que pertenece el bloque de datos basándose en la marca de tiempo del bloque de datos y guarda el bloque de datos en el panel.

    Un bloque de datos sólo se guarda en un panel. En este caso, solo existe una copia de datos en la memoria.

    Figura 3 Guardar datos en una ventana
  3. Para activar una ventana, compute todos los paneles contenidos en la ventana y combine todos estos paneles en una ventana completa.
    Figura 4 Activar una ventana
  4. Si no se requiere un panel, puede eliminarlo de la memoria.
    Figura 5 Eliminar una ventana

Después de la optimización, la cantidad de copias de datos en la memoria y la instantánea se reduce considerablemente.