Как я могу обновить широковещательную переменную в потоковой передаче искры?
Я полагаю, у меня есть довольно распространенный вариант использования потоковой передачи искры:
У меня есть поток объектов, которые я хотел бы отфильтровать на основе некоторых справочных данных
Первоначально я думал, что это будет очень просто достичь с помощьюПеременная трансляции:
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>
хотя это будет отправлять справочные данные с каждым объектом.