Тюнинг Спарк Работа в Пряже - PullRequest
0 голосов
/ 04 мая 2018

Моя работа искры не выполняется из-за java.lang.OutOfMemoryError: пространство кучи Java. Я попытался поиграть с параметрами конфигурации, такими как executor-cores, executor-memory, num-executors, driver-cores, driver-memory, spark.yarn.driver.memoryOverhead, spark.yarn.executor.memoryOverhead в соответствии с ответом Рамзи . Ниже мой набор настроек

--master yarn-cluster --executor-cores 4 --executor-memory 10G --num-executors 30 --driver-cores 4 --driver-memory 16G --queue team_high --conf spark.eventLog.dir=hdfs:///spark-history --conf spark.eventLog.enabled=true --conf spark.yarn.historyServer.address=xxxxxxxxx:xxxx --conf spark.sql.tungsten.enabled=true --conf spark.ui.port=5051 --conf spark.sql.shuffle.partitions=30 --conf spark.yarn.driver.memoryOverhead=1024 --conf spark.yarn.executor.memoryOverhead=1400 --conf spark.dynamicAllocation.enabled=true --conf spark.shuffle.service.enabled=true --conf spark.sql.orc.filterPushdown=true --conf spark.scheduler.mode=FAIR --conf hive.exec.dynamic.partition=false --conf hive.exec.dynamic.partition.mode=nonstrict --conf mapreduce.fileoutputcommitter.algorithm.version=2 --conf orc.stripe.size=67108864 --conf hive.merge.orcfile.stripe.level=true --conf hive.merge.smallfiles.avgsize=2560000 --conf hive.merge.size.per.task=2560000 --conf spark.driver.extraJavaOptions='-XX:+UseCompressedOops -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps' --conf spark.executor.extraJavaOptions='-XX:+UseCompressedOops -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC'

Иногда это работает и в большинстве случаев не работает над вышеупомянутой проблемой. Во время отладки я нашел следующие журналы GC. Может ли кто-нибудь помочь мне понять эти журналы и помочь мне настроить эту работу?

#
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill %p"
#   Executing /bin/sh -c "kill 79911"...
Heap
 PSYoungGen      total 2330112K, used 876951K [0x00000006eab00000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 1165312K, 75% used [0x00000006eab00000,0x0000000720365f50,0x0000000731d00000)
  from space 1164800K, 0% used [0x0000000731d00000,0x0000000731d00000,0x0000000778e80000)
  to   space 1164800K, 0% used [0x0000000778e80000,0x0000000778e80000,0x00000007c0000000)
 ParOldGen       total 6990848K, used 6990706K [0x0000000540000000, 0x00000006eab00000, 0x00000006eab00000)
  object space 6990848K, 99% used [0x0000000540000000,0x00000006eaadc9c0,0x00000006eab00000)
 Metaspace       used 69711K, capacity 70498K, committed 72536K, reserved 1112064K
  class space    used 9950K, capacity 10182K, committed 10624K, reserved 1048576K
End of LogType:stdout

1 Ответ

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

Я столкнулся с периодически возникающими проблемами с памятью при запуске искры в кластере, и обнаружил, что это происходит главным образом по следующим причинам: -

1) Rdd-разделы могут быть слишком большими для обработки, вы можете уменьшить размер раздела, увеличив число разделов с помощью API переразбиения. Это уменьшит объем данных, которые будет обрабатывать каждый исполнитель. Поскольку вы предоставили исполнителю 10 и 4 ядра, это означает, что этот исполнитель может выполнять 4 одновременных задачи (раздела), и эти 4 задачи будут распределять между собой 10 г памяти, что в точности означает 2,5 г для обработки одного раздела.

val rddWithMorePartitions = rdd.repartition(rdd.getNumPartitions*2)

2) Если ваш сценарий использования требует больших вычислительных ресурсов и вы не выполняете никакого кэширования, вы можете уменьшить объем памяти, выделенной для хранения, путем настройки ниже параметра.

spark.storage.memoryFraction = 0.6 (по умолчанию)

Вы можете изменить его ниже-

spark.storage.memoryFraction=0.5

3) Вы должны рассмотреть вопрос об увеличении памяти исполнителя до 25 ГБ.

--executor-memory 26G
...