Проблема с памятью pyspark: Причина: java.lang.OutOfMemoryError: Пространство кучи Java - PullRequest
0 голосов
/ 18 мая 2018

Folks,

Я использую код pyspark для чтения файла 500 Мб из hdfs и создаю пустую матрицу из содержимого файла

Информация о кластере:

9 датоданных128 ГБ памяти / 48 vCore ЦП / узел

Конфигурация задания

  conf = SparkConf().setAppName('test') \
                          .set('spark.executor.cores', 4) \
                          .set('spark.executor.memory', '72g') \
                          .set('spark.driver.memory', '16g') \
                          .set('spark.yarn.executor.memoryOverhead',4096 ) \
                          .set('spark.dynamicAllocation.enabled', 'true') \
                          .set('spark.shuffle.service.enabled', 'true') \
        .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") \
                          .set('spark.driver.maxResultSize',10000) \
                          .set('spark.kryoserializer.buffer.max', 2044) 

    fileRDD=sc.textFile("/tmp/test_file.txt")
    fileRDD.cache
    list_of_lines_from_file = fileRDD.map(lambda line: line.split(" ")).collect()

Ошибка

Сборный элемент выплевывает ошибку памяти.

18/05/17 19:03:15 ERROR client.TransportResponseHandler: Still have 1 
requests outstanding when connection fromHost/IP:53023 is closed
18/05/17 19:03:15 ERROR shuffle.OneForOneBlockFetcher: Failed while starting block fetches
java.lang.OutOfMemoryError: Java heap space

любая помощь очень ценится.

1 Ответ

0 голосов
/ 18 мая 2018

Небольшая предыстория по этому вопросу

У меня была эта проблема, когда я запускал код через Блокнот Jupyter, который работает на edgenode кластера hadoop

Поиск в Jupyter

поскольку вы можете передавать код только из Jupyter через клиентский режим (эквивалентно запуску spark-shell из edgenode) драйвером spark всегда является edgenode, который уже упакован с другими долго работающими процессами демона, где всегда доступна доступная памятьменьше, чем требуется для fileRDD.collect () в моем файле

Работает нормально в spark-submit

Я поместил содержимое из Jupyer в файл .py и вызвал его через spark-отправить с такими же настройками, он работал в течение нескольких секунд, причина в том, что spark-submit оптимизирован для выбора узла драйвера из одного из узлов, которым требуется свободная память из кластера.

spark-submit --name  "test_app" --master yarn --deploy-mode cluster --conf spark.executor.cores=4 --conf spark.executor.memory=72g --conf spark.driver.memory=72g --conf spark.yarn.executor.memoryOverhead=8192 --conf spark.dynamicAllocation.enabled=true  --conf spark.shuffle.service.enabled=true --conf spark.serializer=org.apache.spark.serializer.KryoSerializer --conf spark.kryoserializer.buffer.max=2044 --conf spark.driver.maxResultSize=1g --conf spark.driver.extraJavaOptions='-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:MaxDirectMemorySize=2g' --conf spark.executor.extraJavaOptions='-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:MaxDirectMemorySize=2g' test.py

Следующий шаг:

Наш следующий шаг - выяснить, может ли блокнот Jupyter отправлять искровое задание в кластер YARN через Livy JobServer или аналогичный подход.

...