В каком сценарии Объект из узла драйвера сериализуется и отправляется рабочему узлу в Apache Spark - PullRequest
0 голосов
/ 04 февраля 2019

скажем, я объявляю переменную и использую ее внутри функции map / filter в spark.моя объявленная выше переменная каждый раз отправляется от драйвера к работнику для каждой операции со значениями карты / фильтра.

отправляет ли мой helloVariable на рабочий узел длякаждое значение customerRecords?если да, то как этого избежать?

String helloVariable = "hello testing"; //or some config/json object
JavaDStream<String> javaDStream = consumerRecordJavaInputDStream.map(
    consumerRecord -> {
     return consumerRecord.value()+" --- "+helloVariable;
    } );

1 Ответ

0 голосов
/ 04 февраля 2019

Да.Когда вы обычно передаете функции в Spark, такие как map () или filter (), эти функции могут использовать переменные, определенные вне их в программе драйвера, но каждая задача, работающая в кластере, получает новую копию каждой переменной (используя сериализациюи отправка по сети), а обновления из этих копий не передаются обратно в драйвер.
Таким образом, общий случай для этого сценария - использовать переменные вещания .
Переменные вещания позволяют программистухраните переменную только для чтения в кэше на каждой машине, а не отправляйте ее копию с задачами.Если вас интересует механизм вещания, здесь вы можете прочитать очень хорошее краткое объяснение.
Согласно документации Spark, этот процесс может быть графически показан так:

Broadcast variable

Широковещательные переменные можно использовать, например, для эффективного предоставления каждому узлу копии большого набора данных (например, словаря со списком ключевых слов).Spark также пытается распределить широковещательные переменные, используя эффективные алгоритмы широковещания, чтобы снизить стоимость связи.

Так что в вашем случае ваш код может выглядеть следующим образом:

Broadcast<String> broadcastVar = sc.broadcast("hello testing");
JavaDStream<String> javaDStream = consumerRecordJavaInputDStream.map(
    consumerRecord -> {
         return consumerRecord.value() + " --- " + broadcastVar.value();
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...