Come posso aggiornare una variabile di trasmissione in spark streaming?

Ho, credo, un caso d’uso relativamente comune per lo streaming di scintille:

Ho un stream di oggetti che vorrei filtrare in base ad alcuni dati di riferimento

Inizialmente, ho pensato che sarebbe stata una cosa molto semplice ottenere usando una variabile di trasmissione :

public void startSparkEngine { Broadcast refdataBroadcast = sparkContext.broadcast(getRefData()); final JavaDStream 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; }); } 

Tuttavia, anche se di rado, i miei dati di riferimento cambieranno periodicamente

Avevo l’impressione di poter modificare e ri-trasmettere la mia variabile sul driver e sarebbe propagata a ciascuno dei lavoratori, tuttavia l’object Broadcast non è Serializable e deve essere final .

    Quali alternative ho? Le tre soluzioni a cui posso pensare sono:

    1. Spostare la ricerca dei dati di riferimento in forEachPartition o forEachRdd modo che risieda interamente sui worker. Tuttavia, i dati di riferimento sono presenti in un’API REST, quindi dovrei anche memorizzare in qualche modo un timer / contatore per impedire l’accesso al remoto per ogni elemento nel stream.

    2. Riavvia il Contesto Spark ogni volta che cambia il refdata, con una nuova Variabile di Trasmissione.

    3. Converti i dati di riferimento in un RDD , quindi join ai flussi in modo tale che ora sto Pair lo streaming Pair , anche se questo invierà i dati di riferimento con ogni object.