Мой кластер: 1 ведущий, 11 ведомых, каждый узел имеет 6 ГБ памяти.
Мои настройки:
spark.executor.memory=4g, Dspark.akka.frameSize=512
Вот проблема:
Сначала я прочитал некоторые данные (2,19 ГБ) из HDFS в RDD:
val imageBundleRDD = sc.newAPIHadoopFile(...)
Во-вторых , сделайте что-нибудь на этом RDD:
val res = imageBundleRDD.map(data => {
val desPoints = threeDReconstruction(data._2, bg)
(data._1, desPoints)
})
Наконец , вывод в HDFS:
res.saveAsNewAPIHadoopFile(...)
Когда я запускаю свою программу, она показывает:
.....
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Starting task 1.0:24 as TID 33 on executor 9: Salve7.Hadoop (NODE_LOCAL)
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Serialized task 1.0:24 as 30618515 bytes in 210 ms
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Starting task 1.0:36 as TID 34 on executor 2: Salve11.Hadoop (NODE_LOCAL)
14/01/15 21:42:28 INFO cluster.ClusterTaskSetManager: Serialized task 1.0:36 as 30618515 bytes in 449 ms
14/01/15 21:42:28 INFO cluster.ClusterTaskSetManager: Starting task 1.0:32 as TID 35 on executor 7: Salve4.Hadoop (NODE_LOCAL)
Uncaught error from thread [spark-akka.actor.default-dispatcher-3] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled for ActorSystem[spark]
java.lang.OutOfMemoryError: Java heap space
Есть слишком много задач?
PS : все нормально, когда входные данные составляют около 225 МБ.
Как я могу решить эту проблему?
out-of-memory
apache-spark
hequn8128
источник
источник
Ответы:
У меня есть несколько предложений:
spark.executor.memory=6g
. Убедитесь, что вы используете как можно больше памяти , проверив пользовательский интерфейс (он скажет, сколько памяти вы используете)spark.storage.memoryFraction
. Если вы не используетеcache()
илиpersist
в своем коде, это также может быть 0. По умолчанию это 0,6, что означает, что вы получаете только 0,4 * 4 г памяти для вашей кучи. Уменьшение IME часто приводит к тому, что OOM исчезают. ОБНОВЛЕНИЕ: Начиная с версии 1.6, очевидно, нам больше не нужно играть с этими значениями, их будет определять автоматически.String
и сильно вложенных структур (например,Map
классов с вложенными падежами). Если возможно, старайтесь использовать только примитивные типы и индексировать все не примитивы, особенно если вы ожидаете много дубликатов. По возможности выбирайтеWrappedArray
вложенные структуры. Или даже разверните свою собственную сериализацию - у вас будет большая информация о том, как эффективно вернуть ваши данные в байты, использовать его !Dataset
для кэширования вашей структуры, так как она будет использовать более эффективную сериализацию. Это следует рассматривать как взлом по сравнению с предыдущим пунктом пули. Встраивание знаний о предметной области в ваш алгоритм / сериализацию может минимизировать объем памяти / кэш-памяти в 100 или 1000 раз, тогда какDataset
, скорее всего, это даст 2–5 раз в памяти и 10 раз сжато (паркет) на диске.http://spark.apache.org/docs/1.2.1/configuration.html
РЕДАКТИРОВАТЬ: (Так что я могу гуглить себя проще) Следующее также указывает на эту проблему:
источник
spark.executor.memory
потому что вам определенно необходим некоторый объем памяти для накладных расходов ввода-вывода. Если вы используете все это, это замедлит вашу программу. Исключением из этого может быть Unix, в этом случае у вас есть пространство подкачки.Чтобы добавить к этому пример использования, который часто не обсуждается, я предложу решение при подаче
Spark
заявки черезspark-submit
в локальном режиме.Согласно справочнику « Освоение Apache Spark » Яцека Ласковского :
Таким образом, если вы сталкиваетесь с
OOM
ошибкамиheap
, достаточно откорректировать,driver-memory
а неexecutor-memory
.Вот пример:
источник
Вы должны настроить параметры памяти offHeap, как показано ниже:
Предоставьте память водителя и исполнителя в соответствии с доступностью оперативной памяти вашей машины. Вы можете увеличить размер offHeap, если вы все еще сталкиваетесь с проблемой OutofMemory .
источник
config
решило проблему.Вы должны увеличить память водителя. Я думаю, что в вашей папке $ SPARK_HOME / conf вы должны найти файл
spark-defaults.conf
, отредактировать и установить вspark.driver.memory 4000m
зависимости от памяти вашего мастера. Это то, что исправило проблему для меня, и все идет гладкоисточник
Взгляните на сценарии запуска, в которых установлен размер кучи Java, похоже, что вы не устанавливаете это до запуска Spark worker.
Вы можете найти документацию для развертывания скриптов здесь .
источник
start up scripts
, изменилось, к сожалению. По состоянию на 2019-12-19 гг. Таких вариантов не былоЯ сильно пострадал от этой проблемы, мы используем динамическое распределение ресурсов, и я подумал, что он будет использовать ресурсы моего кластера для наилучшего соответствия приложению.
Но правда в том, что динамическое распределение ресурсов не устанавливает память драйвера и сохраняет ее по умолчанию, равную 1g.
Я решил эту проблему, установив spark.driver.memory в число, соответствующее памяти моего драйвера (для оперативной памяти 32 ГБ я установил 18 ГБ)
Вы можете установить его, используя команду spark submit:
Очень важное примечание, это свойство не будет учитываться, если вы установите его из кода, в соответствии с документацией spark:
источник
Вообще говоря, память Spark Executor JVM можно разделить на две части. Искровая память и Пользовательская память. Это контролируется свойством
spark.memory.fraction
- значение находится в диапазоне от 0 до 1. При работе с изображениями или выполнении интенсивной обработки памяти в искровых приложениях рассмотрите возможность уменьшенияspark.memory.fraction
. Это сделает больше памяти доступной для работы вашего приложения. Spark может разлиться, поэтому он все равно будет работать с меньшим объемом памяти.Вторая часть проблемы - разделение труда. Если возможно, разделите ваши данные на более мелкие куски. Меньшие данные, возможно, требуют меньше памяти. Но если это невозможно, вы жертвуете вычислениями на память. Обычно один исполнитель будет работать с несколькими ядрами. Всего памяти исполнителей должно быть достаточно для обработки требований к памяти для всех одновременных задач. Если увеличение памяти исполнителя невозможно, вы можете уменьшить количество ядер для каждого исполнителя, чтобы каждая задача получала больше памяти для работы. Протестируйте с 1 исполнителями ядра, которые имеют максимально возможную память, которую вы можете дать, а затем продолжайте увеличивать количество ядер, пока не найдете наилучшее число ядер.
источник
Вы сбросили свой главный журнал gc? Поэтому я столкнулся с подобной проблемой и обнаружил, что SPARK_DRIVER_MEMORY устанавливает только кучу Xmx. Первоначальный размер кучи остается 1G, а размер кучи никогда не увеличивается до кучи Xmx.
Передача "--conf" spark.driver.extraJavaOptions = -Xms20g "решает мою проблему.
PS Aux | grep java и вы увидите следующий журнал: =
24501 30,7 1,7 41782944 2318184 баллов / 0 сл + 18:49 0:33 / usr / java / последние / bin / java -cp / opt / spark / conf /: / opt / spark / jars / * -Xmx30g -Xms20g
источник
Расположение для установки размера кучи памяти (по крайней мере в spark-1.0.0) находится в conf / spark-env. Соответствующими переменными являются
SPARK_EXECUTOR_MEMORY
&SPARK_DRIVER_MEMORY
. Больше документов в руководстве по развертываниюТакже не забудьте скопировать файл конфигурации на все подчиненные узлы.
источник
SPARK_EXECUTOR_MEMORY
&SPARK_DRIVER_MEMORY
?SPARK_EXECUTOR_MEMORY
, а какая ошибка скажет вам увеличитьSPARK_DRIVER_MEMORY
?У меня есть несколько предложений для вышеупомянутой ошибки.
● Убедитесь, что память исполнителя, назначенная исполнителю, может иметь дело с разделами, требующими больше памяти, чем назначено.
● Попытайтесь проверить, работает ли больше случайных чисел, поскольку они являются дорогостоящими операциями, поскольку они включают дисковый ввод-вывод, сериализацию данных и сетевой ввод-вывод
● использовать широковещательные соединения
● Избегайте использования groupByKeys и попробуйте заменить на ReduceByKey
● Избегайте использования огромных Java-объектов везде, где происходит перетасовка
источник
Исходя из моего понимания приведенного выше кода, он загружает файл, выполняет операцию отображения и сохраняет его обратно. Там нет операции, которая требует перемешивания. Кроме того, не существует операции, требующей передачи данных в драйвер, поэтому настройка всего, что связано с тасованием или драйвером, может не повлиять. Драйвер имеет проблемы, когда задач слишком много, но это было только до версии Spark 2.0.2. Там может быть две вещи, которые идут не так, как надо.
источник
Установка этих точных конфигураций помогла решить проблему.
источник