Почему sc.wholeTextFile (). Collect () медленный - PullRequest
0 голосов
/ 17 сентября 2018

Я использую локальный режим Spark2.1 (local [4]) и пытаюсь вызвать sc.wholeTextFiles для чтения набора данных news20 как RDD: val rdd = sc.wholeTextFiles("~/20news-18828/*", 4) val result = rdd.collect() Набор данных загружается отсюда: http://qwone.com/%7Ejason/20Newsgroups/20news-18828.tar.gz и послераспаковывая его, в папке 20news-18828 будет 20 папок категорий.Для каждой подпапки будет около 900 небольших текстовых файлов и, таким образом, всего 18828 текстовых файлов.В настоящее время данные находятся на моей локальной машине, и, вероятно, в будущем я буду читать их из HDFS.

Моя проблема в том, что вызов rdd.collect() выше очень медленный, что занимает около 90 секунд ... В противном случае, если яиспользуйте локальный API-интерфейс Java для чтения всех файлов в виде массива, а затем sc.parallelize then collect, он почти сразу завершится.

Хотите знать, почему использование sc.wholeTextFiles так медленно?Или что я делаю не так?Я просто не знаком со Spark, и любая помощь будет оценена!

Заранее большое спасибо!

1 Ответ

0 голосов
/ 17 сентября 2018

Это медленнее, чем чтение локального файла, потому что вы несете издержки, которые не добавляют никакого значения.

// read files into at least 4 partitions
// here you have the overhead of spinning up driver and executors and partitioning data
val rdd = sc.wholeTextFiles("~/20news-18828/*", 4)

// pull all of the data back from the executors and put it all on the driver
val result = rdd.collect()

Чтобы получить выигрыш в производительности от искрового параллелизма, вам необходимо каким-то образом обрабатывать данные параллельно.

Поскольку вы только начинаете работу со Spark, я рекомендую начинать с более нового API DataFrame, а не со старым низкоуровневым контекстом зажигания / RDD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...