Как я могу обновить широковещательную переменную в потоковой передаче искры?

Я полагаю, у меня есть довольно распространенный вариант использования потоковой передачи искры:

У меня есть поток объектов, которые я хотел бы отфильтровать на основе некоторых справочных данных

Первоначально я думал, что это будет очень просто достичь с помощьюПеременная трансляции:

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

Тем не менее, хотя и нечасто,мои справочные данные будут периодически меняться

У меня сложилось впечатление, что я могу изменить иповторное вещание моя переменная на водителя, и она будет распространена на каждого из работников, однакоBroadcast объект неSerializable и должен бытьfinal.

Какие у меня есть альтернативы? Три решения, которые я могу придумать:

Переместите поиск справочных данных вforEachPartition или жеforEachRdd так что он целиком лежит на рабочих. Однако эталонные данные живут за REST API, поэтому мне также необходимо каким-то образом сохранить таймер / счетчик, чтобы остановить удаленный доступ для каждого элемента в потоке.

Перезапускайте Spark Context каждый раз, когда изменяются данные, с новой Broadcast Variable.

Преобразовать справочные данные вРДД, затемjoin потоки таким образом, что я сейчас потоковоеPair<MyObject, RefData>хотя это будет отправлять справочные данные с каждым объектом.

Ответы на вопрос(1)

Ваш ответ на вопрос