Да.Когда вы обычно передаете функции в Spark, такие как map () или filter (), эти функции могут использовать переменные, определенные вне их в программе драйвера, но каждая задача, работающая в кластере, получает новую копию каждой переменной (используя сериализациюи отправка по сети), а обновления из этих копий не передаются обратно в драйвер.
Таким образом, общий случай для этого сценария - использовать переменные вещания .
Переменные вещания позволяют программистухраните переменную только для чтения в кэше на каждой машине, а не отправляйте ее копию с задачами.Если вас интересует механизм вещания, здесь вы можете прочитать очень хорошее краткое объяснение.
Согласно документации Spark, этот процесс может быть графически показан так:
![Broadcast variable](https://i.stack.imgur.com/boGDi.png)
Широковещательные переменные можно использовать, например, для эффективного предоставления каждому узлу копии большого набора данных (например, словаря со списком ключевых слов).Spark также пытается распределить широковещательные переменные, используя эффективные алгоритмы широковещания, чтобы снизить стоимость связи.
Так что в вашем случае ваш код может выглядеть следующим образом:
Broadcast<String> broadcastVar = sc.broadcast("hello testing");
JavaDStream<String> javaDStream = consumerRecordJavaInputDStream.map(
consumerRecord -> {
return consumerRecord.value() + " --- " + broadcastVar.value();
});