Обработка большого файла с pyspark локально - PullRequest
0 голосов
/ 16 марта 2019

Я новичок в PySpark и просто использую его для обработки данных.

У меня есть файл объемом 120 ГБ, содержащий более 1,05 миллиарда строк.Я могу обработать агрегацию и фильтрацию файла и вывести результат в файл CSV с помощью функции coalesce () без проблем.

Моя проблема заключается в том, когда я пытаюсь прочитать каждую строку в файле, чтобывыполнить какое-то вычисление, и моя работа с искрой завершится неудачно с использованием функций .collect () или .toLocalIterator ().Когда я ограничиваю количество строк, которые я читаю, это работает нормально.

Пожалуйста, как я могу решить эту проблему?Можно ли читать строки в битах, например, строку за раз или порцию за раз?

Я запускаю Spark локально на компьютере с 64 ГБ ОЗУ.

Ниже приведен пример моегокод Python, который работает:

sql = "select * from table limit 1000"
details = sparkSession.sql(sql).collect()
for detail in details:
    #do some computation

Ниже приведен пример моего кода Python, который не работает:

sql = "select * from table"
details = sparkSession.sql(sql).collect()
for detail in details:
    #do some computation

Вот как я отправляю свою искровую работу

spark-submit --driver-memory 16G --executor-memory 16G python_file.py

Большое спасибо.

1 Ответ

0 голосов
/ 16 марта 2019

Ваш подход к проблеме неправильный.метод collect загружает полный файл (фактически может занять более 120 ГБ из-за десериализации) в память драйвера (процесс одного pyspark), вызывая нехватку памяти.
Как правило, если вы используете метод collect()в искровом коде это не очень хорошо и должно быть изменено.

При правильном использовании спарк за один раз будет считывать только часть входных данных (входное разделение) для обработки и вырабатывает (намного меньше) промежуточныйрезультаты сохраняются в памяти исполнителя.Таким образом, он (в зависимости от вида обработки) может обрабатывать 120 ГБ файла с 16 ГБ памяти.

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