¿Cómo puedo actualizar una variable de transmisión en la transmisión por chispa?

Tengo, creo, un caso de uso relativamente común para la transmisión por chispa:

Tengo una secuencia de objetos que me gustaría filtrar en función de algunos datos de referencia

Inicialmente, pensé que esto sería algo muy simple de lograr usando unDifusión Variable:

public void startSparkEngine {
    Broadcast<ReferenceData> refdataBroadcast
      = sparkContext.broadcast(getRefData());

    final JavaDStream<MyObject> filteredStream = objectStream.filter(obj -> {
        final ReferenceData refData = refdataBroadcast.getValue();
        return obj.getField().equals(refData.getField());
    }

    filteredStream.foreachRDD(rdd -> {
        rdd.foreach(obj -> {
            // Final processing of filtered objects
        });
        return null;
    });
}

Sin embargo, aunque con poca frecuencia,mis datos de referencia cambiarán periódicamente

Tenía la impresión de que podía modificar yretransmitir mi variable en el controlador y se propagaría a cada uno de los trabajadores, sin embargo, elBroadcast el objeto no esSerializable y necesita serfinal.

¿Qué alternativas tengo? Las tres soluciones que se me ocurren son:

Mueva la búsqueda de datos de referencia a unforEachPartition oforEachRdd para que resida completamente en los trabajadores. Sin embargo, los datos de referencia viven en una API REST, por lo que también necesitaría almacenar de alguna manera un temporizador / contador para detener el acceso remoto para cada elemento en la secuencia.

Reinicie el contexto de chispa cada vez que cambie la refdata, con una nueva variable de difusión.

Convierta los datos de referencia en unRDD, luegojoin las transmisiones de tal manera que ahora estoy transmitiendoPair<MyObject, RefData>, aunque esto enviará los datos de referencia con cada objeto.

Respuestas a la pregunta(4)

Su respuesta a la pregunta