La duplicación de datos a través de las ventanas de relleno en un número indefinido de puntos

oalashqar:

Estoy tratando de duplicar los registros de datos en las ventanas futuras. El problema es que esto resuelve que las estadísticas de computación en cada ventana será más preciso, ya que estos datos es continua (como la temperatura) y requiere un valor de referencia.

En estos diagramas, cada cuadro representa una ventana fija. Los números de cada ventana representan datos que vienen en una PCollection procedente de una fuente.

Este es un ejemplo de entrada PCollection:

+---------+---------+---------+--------->
| 1  2    |       3 |         |         |
+---------+---------+---------+--------->

Y la salida resultante PCollection:

+---------+---------+---------+--------->
| 1  2    | 2     3 | 3       | 3       |
+---------+---------+---------+--------->

Observe cómo el punto de datos más reciente (basado en fecha y hora del evento) se envía a la siguiente ventana. Si hay varias ventanas vacías, el valor debe ser re-enviada.

He resuelto el problema del desvío de una vez mediante la ejecución del PCollection ventana a través de un DoFn con estado que emite un extra elemento duplicado y modificado:

public class DupeFn extends DoFn<Datum, Datum> {
    @StateId("latest")
    private final StateSpec<ValueState<Datum>> latestStateSpec = StateSpecs.value();

    @TimerId("emit")
    private final TimerSpec emitSpec = TimerSpecs.timer(TimeDomain.EVENT_TIME);

    @ProcessElement
    public void processElement(
            @Element Datum element,
            OutputReceiver<Datum> receiver,
            IntervalWindow window,
            @StateId("latest") ValueState<Datum> latest,
            @TimerId("emit") Timer emit
    ) {
        emit.set(window.maxTimestamp());

        Datum prev = latest.read();

        if (prev == null || element.timestamp > prev.timestamp) {
            latest.write(element);
        }

        receiver.output(element);
    }

    @OnTimer("emit")
    public void emitLatest(
            OutputReceiver<Datum> receiver,
            IntervalWindow window,
            @StateId("latest") ValueState<Datum> latest
    ) {
        Datum last = latest.read();

        // modify the timestamp such that it lands in the next window
        last.timestamp = window.end().getMillis() + 10;
        last.id += " DUPED";

        receiver.outputWithTimestamp(last, new Instant(last.timestamp));
    }
}

El problema ahora es que nada va a ser duplicado en la ventana del procedimiento, si hay una ventana vacía. Idealmente, el comportamiento sería como se describe en el diagrama de arriba.

¿Hay alguna forma de hacer esto?

Editar
He encontrado esta entrada del blog publicada relevante.

Reza Rokni:

Hay un pequeño problema con la documentación de la viga en el momento, una vez que eso fijos debe aparecer el blog. Los contadores de tiempo de bucle le dará parte de la solución a este problema. Ya que garantizará hay actividad en todas las ventanas de intervalo, incluso en ausencia de datos.

Editar: El blog ya está disponible aquí Enlace al Blog

La siguiente pieza requiere el uso de global de Windows que lleva consigo un poco más de complejidad. Habrá una charla sobre esto en la semana próxima Cumbre de haz Apache.

Cumbre de Berlín

Con el fin de mantener el estado tendrá que fluir sus agregaciones ventanas fijas en un GlobalWindow. Sin embargo GlobalWindow no ordena la garantía, por lo que tendrá que seguir algo en la línea de este flujo:

@ProcessElement

@A tiempo

  • Leer y ordenar la BaggedList por Fecha
  • La cadena de valor final de cada agregación en la siguiente agregación si la próxima agregación no tiene un valor (Se hizo usando el temporizador de bucle no fuente de datos externa).
  • Salida de todos los valores, donde la marca de tiempo es <luego el OnTimer.Timestamp
  • Borrar el baglist de cualquier elemento ya procesada, tenga en cuenta hoy en día esto es ineficiente ya que no puede eliminar los elementos específicos de la lista. Si nos fijamos en las listas dev en Apache Beam hay una buena discusión sobre la solicitud de Mapa Ordenada en el futuro que será muy útil en este caso.

En este momento no es una respuesta corta!

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=234915&siteId=1
Recomendado
Clasificación