Como posso atualizar uma variável de transmissão no spark streaming?

Acredito que tenho um caso de uso relativamente comum para o streaming de faíscas:

Eu tenho um fluxo de objetos que gostaria de filtrar com base em alguns dados de referência

Inicialmente, pensei que isso seria uma coisa muito simples de conseguir usando umVariável de transmissão:

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;
    });
}

No entanto, embora com pouca frequência,meus dados de referência mudam periodicamente

Fiquei com a impressão de poder modificar eretransmitir minha variável no driver e seria propagada para cada um dos trabalhadores, porém oBroadcast objeto não éSerializable e precisa serfinal.

Que alternativas eu tenho? As três soluções em que consigo pensar são:

Mova a pesquisa de dados de referência para umforEachPartition ouforEachRdd de modo que reside inteiramente nos trabalhadores. No entanto, os dados de referência permanecem na API REST, portanto, também seria necessário armazenar um contador / timer para impedir o acesso remoto a todos os elementos do fluxo.

Reinicie o contexto do Spark toda vez que os refdata forem alterados, com uma nova variável de transmissão.

Converta os dados de referência em umRDD, entãojoin os fluxos de tal maneira que agora estou transmitindoPair<MyObject, RefData>, embora isso envie os dados de referência com todos os objetos.

questionAnswers(4)

yourAnswerToTheQuestion