сбор данных занимает больше времени, чем первый, для небольшого набора данных - PullRequest
0 голосов
/ 07 июня 2019

У меня есть данные, сохраненные как один раздел в HDFS (в байтах), и когда я хочу получить содержимое данных, используя приведенный ниже код, collect занимает больше времени, чем first в одном разделе данных.

JavaRDD<String> mytext = sc.textFile("...");
List<String> lines = mytext.collect();

Я ожидал, что collect и first займут одно и то же время.И все же collect медленнее, чем first для данных в одном разделе HDFS.

В чем может быть причина этого?

1 Ответ

1 голос
/ 08 июня 2019

rdd.first() не должен сканировать весь раздел. Получает только первый пункт и возвращает его. rdd.collect() должен просканировать весь раздел, собрать все и отправить все это обратно (сериализация + затраты на десериализацию и т. д.)

Причина (см. Форум apache-spark-developers) скорее всего потому, что first () полностью выполняется на драйвере узел в том же процессе, в то время как collect () должен соединиться с работником узлы.

Обычно при первом запуске действия большая часть кода JVM не оптимизирован, и загрузчик классов также должен загрузить много вещей на летать. Необходимость соединения с другими процессами через RPC может замедлить первый казнь в сборе.

Тем не менее, если вы запустите это несколько раз (в одной и той же программе драйвера) и все еще намного медленнее, вы должны посмотреть на другие факторы, такие как сеть перегрузка, загрузка процессора / памяти на рабочих и т. д.

...