Spark foreachPartition запускается только на мастере - PullRequest
1 голос
/ 21 июня 2019

У меня есть кластер DataProc с одним мастером и 4 работниками.У меня есть это искровое задание:

JavaRDD<Signal> rdd_data = javaSparkContext.parallelize(my_data, 8);

rdd_data.foreachPartition(partitionOfRecords -> {
    println("Items in partition-" + partitionOfRecords.count(y=>true));
    })

Где my_data - это массив с около 1000 элементов.Задание в кластере запускается правильно и возвращает правильные данные, но выполняется только на главном сервере, а не на рабочих.Я использую dataproc image 1.4 для каждой машины в кластере

Кто-нибудь может помочь мне понять, почему это задание выполняется только на master?

Ответы [ 2 ]

2 голосов
/ 22 июня 2019

Здесь есть две достопримечательности:

  1. Строка println("Items in partition-" + partitionOfRecords.count(y=>true)); выведет ожидаемые результаты только в том случае, если исполнитель является тем же узлом, что и клиент, на котором выполняется программа Spark. Это происходит потому, что команда println использует поток stdout под капотом, который доступен только на одном компьютере, поэтому сообщения от разных узлов не могут быть переданы клиентской программе.
  2. Когда вы устанавливаете master на local [1], вы заставляете Spark запускаться локально, используя один поток, поэтому Spark и клиентская программа используют один и тот же поток stdout, и вы можете видеть выходные данные программы. Это также означает, что драйвер и исполнитель - это один и тот же узел.
1 голос
/ 22 июня 2019

Я нашел master local [1] в дополнительном конфиге Spark! Теперь работает правильно!

...