Я полагаю, что ваша проблема может быть связана с тем, как вы отправляете свою работу:
pyspark --num-executors 5 --driver-memory 2g --executor-memory 2g
Если размер файла, как вы говорите, составляет 65 ГБ, вышеприведенное представление говорит искруиспользуйте только 2 ГБ доступной памяти.
Попробуйте увеличить значение параметра --driver-memory
до размера, немного превышающего размер вашего файла .csv.
например, --driver-memory 70G
Чтобы объяснить, почему это необходимо:
Без кластера с распределенной файловой системой весь ваш набор данных находится на локальном диске.Spark позволяет оптимизировать распределение задач по кластеру, но без привязки к указанному кластеру отдельных машин все ваши данные будут загружены в память вашего драйвера.Таким образом, несмотря на то, что здесь у вас более высокий параллелизм, вам нужно разрешить заданию занимать столько же или больше места, чем ваш входной файл.
Редактировать - чтобы ответить на ваши вопросы в комментариях:
Существует несколько концепций, которые являются ключевыми для понимания, когда вам необходимо выделить 65 ГБ для драйвера для задания Spark и когда это не нужно.
Во-первых, Spark работает JVM (виртуальная машина Java) - место, где код фактически выполняется.JVM содержит «пространство кучи», которое можно понять как объем памяти, который виртуальная машина имеет и может использовать.В приведенном выше сценарии у вас нет кластера отдельных машин, и ваши данные не распределяются по ним, поэтому вам необходимо предоставить базовой JVM достаточно памяти для хранения ваших данных, возможно, даже больше, если вы собираетесь выполнять какие-либо действия, которые увеличиваютразмер ваших данных любым способом.
Теперь Spark сам по себе является платформой, которая позволяет вам выполнять вычислительно дорогостоящие задачи параллельно и оптимизированным способом, но он показывает весь свой потенциал, когда у вас есть распределенная файловая система, такая как HDFS (распределенная файловая система Hadoop).
При хранении данных в HDFS вы отправляете их фрагменты на каждую машину, и Spark позволяет вам работать с данными, хранящимися таким «чанкованным» способом.где каждый отдельный исполнитель на каждой машине в вашем кластере выполняет определенную операцию на небольшом фрагменте.Здесь есть одна загвоздка: если вы когда-нибудь захотите «обработать» ваши данные (т.е. собрать, показать, посчитать), вам нужно снова собрать все полученные данные в одном месте - это то, что мы называем драйвером.
Это приводит к двум сценариям:
- Полученные данные после всех операций являются небольшими и, следовательно, не требуют полных 65 ГБ в драйвере.Хорошим примером этого является случай, когда вам нужно было выполнить агрегирование исходных данных и уменьшить объем данных с ГБ до МБ.
- Данные такие же большие или даже больше, чем исходные, что означает, что вам нужнопо-прежнему предоставлять достаточно памяти водителя, чтобы вместить все это.
В Spark есть много чего понять и поэкспериментировать - я настоятельно рекомендую уделить некоторое время, чтобы прочитать о том, как он работает и что он может сделать для вас. Здесь также есть ссылка на учебное пособие , в котором вы можете ознакомиться с каждым термином