Приложение Spark использует только 1 исполнителя

Я запускаю приложение со следующим кодом. Я не понимаю, почему используется только 1 исполнитель, хотя у меня есть 3. Когда я пытаюсь увеличить диапазон, моя работа не выполняется, потому что диспетчер задач теряет исполнителя. В итоге я вижу значение для случайных записей, но случайные чтения равны 0 (возможно, причина в том, что все данные находятся на одном узле, и для выполнения задания не требуется случайного чтения).

val rdd: RDD[(Int, Int)] = sc.parallelize((1 to 10000000).map(k => (k -> 1)).toSeq)
val rdd2= rdd.sortByKeyWithPartition(partitioner = partitioner)
val sorted = rdd2.map((_._1))
val count_sorted = sorted.collect()

Изменить: я увеличил память исполнителя и ядра и ядра. Я также изменил количество исполнителей с 1 на 4. Это, кажется, помогло. Теперь я вижу случайное чтение / запись на каждом узле.

2 ответа

Решение

..может вызвать все данные на одном узле

Это должно заставить вас думать, что ваш RDD имеет только один раздел вместо 3 или более, который в конечном итоге использовал бы всех исполнителей.

Итак, в продолжение ответа Хокама, вот что я хотел бы сделать:

rdd.getNumPartitions

Теперь, если это 1, то переделите ваш RDD, вот так:

rdd = rdd.repartition(3) 

который разделит ваш RDD на 3 раздела.

Попробуйте выполнить ваш код снова сейчас.

Похоже, ваш код заканчивается только одним разделом для RDD. Вы должны увеличить разделы RDD как минимум до 3, чтобы использовать всех 3 исполнителей.

Другие вопросы по тегам