2016-09-19 8 views
4

У меня есть искробезопасный источник данных размером 500 тыс., Который живет в паркетном файле. Я использую искру 2.0.0 и пакет SparkR внутри Spark (RStudio и R 3.3.1), все запущенные на локальном компьютере с 4 ядрами и 8 гб ОЗУ.Зачем собирать в SparkR так медленно?

Чтобы облегчить построение набора данных, в котором я могу работать в R, я использую метод collect(), чтобы принести искру DataFrame в R. Выполнение занимает около 3 минут, что намного дольше, чем можно было бы прочитать файл CSV с эквивалентным размером, используя пакет data.table.

Понятно, что файл паркета сжимается, и время, необходимое для декомпрессии, может быть частью проблемы, но я нашел другие комментарии в Интернете о том, что метод сбора особенно медленный, и немного в порядке объяснения.

Я пробовал ту же операцию в sparklyr, и это намного быстрее. К сожалению, у sparklyr нет возможности делать путь даты внутри объединений и фильтров так же легко, как SparkR, и поэтому я застрял, используя SparkR. Кроме того, я не считаю, что могу одновременно использовать оба пакета (т. Е. Запускать запросы с использованием вызовов SparkR, а затем обращаться к этим искровым объектам с помощью sparklyr).

Есть ли у кого-то подобный опыт, объяснение относительной медленности метода collect() SparkR и/или любых решений?

ответ

2

@Will

Я не знаю, на самом деле отвечает ли следующий комментарий на ваш вопрос или нет, но искра делает ленивую операцию. Все преобразования, сделанные в Spark (или SparkR), на самом деле не создают каких-либо данных, которые они только создают логический план.

При выполнении таких действий, как сбор, он должен извлекать данные непосредственно из исходных RDD (при условии, что у вас нет кэшированных или сохраненных данных).

Если ваши данные недостаточно велики и могут быть легко обработаны локальным R, тогда нет необходимости идти с SparkR. Другим решением может быть кэширование ваших данных для частого использования.

+0

Пример строки 500K является лишь одним примером и рисуется из таблиц с 300M строк. Spark требуется для выполнения этой работы в моей настройке, но медленность перемещения данных между Spark и R является серьезным замедлением. –

1

Короткие: Сериализация/десериализация происходит очень медленно. Посмотрите, например, сообщение в своем блоге http://dsnotes.com/articles/r-read-hdfs Однако он должен быть одинаково медленным как в sparkR, так и в sparklyr.

+1

Спасибо за объяснение и ссылку. Похоже, что это известная слабость в текущей связи между R и Spark, что является проблемой Python (но все еще присутствует). –

+1

Кроме того, только что подтвердили, что ScarkR на 180 секунд занимает 9 секунд. Так что здесь что-то странное. –

+0

Полезно знать. Посмотрите. Мб что-то новое в протоколе. –