2016-10-27 3 views
1

Мой набор данных ввода - около 150G. Я устанавливаюИскра: память исполнителя превышает физический предел

--conf spark.cores.max=100 
--conf spark.executor.instances=20 
--conf spark.executor.memory=8G 
--conf spark.executor.cores=5 
--conf spark.driver.memory=4G 

но поскольку данные не равномерно распределены по исполнителям, я продолжал получать

Container killed by YARN for exceeding memory limits. 9.0 GB of 9 GB physical memory used 

вот мои вопросы:

1. Did I not set up enough memory in the first place? I think 20 * 8G > 150G, but it's hard to make perfect distribution, so some executors will suffer 
2. I think about repartition the input dataFrame, so how can I determine how many partition to set? the higher the better, or? 
3. The error says "9 GB physical memory used", but i only set 8G to executor memory, where does the extra 1G come from? 

Спасибо!

+0

Вы устанавливаете экземпляры искрообразования на 20. Это означает, что вы будете запускать 20 исполнителей по 8G каждый, если я правильно помню. Можете ли вы попытаться уменьшить их, а затем попробовать? Сокращение до 1 будет началом. – ar7

+0

Привет, сэр, поэтому, если я уменьшу исполнитель до 1, у меня будет только 1 исполнитель с памятью 8G, тогда вход 150G не может поместиться в – user2628641

+0

Это может быть связано с тем, что контейнер с пряжей не был настроен на достаточную память. Возможное решение проблемы, с которой вы столкнулись? http://stackoverflow.com/a/33118489/6199146 и http://m.blog.csdn.net/article/details?id=50387104 – ar7

ответ

2

9ГБ состоит из исполнителя 8 Гб памяти, который вы добавляете в качестве параметра, spark.yarn.executor.memoryOverhead который установлен в .1, так что общая память контейнера spark.yarn.executor.memoryOverhead + (spark.yarn.executor.memoryOverhead * spark.yarn.executor.memoryOverhead) который 8GB + (.1 * 8GB) ≈ 9GB.

Вы можете запустить весь процесс, используя один исполнитель, но это потребует возраста. To understand this you need to know the notion of partitions and tasks. Количество разделов определяется вашим вводом и действиями. Например, если вы читаете csv 150gb из hdfs, а ваш hdfs blockize равен 128 Мб, вы получите 150 * 1024/128 = 1200 разделов, который отображает непосредственно 1200 задач в пользовательском интерфейсе Spark.

Каждая задача будет выбрана исполнителем. Вам не нужно хранить все 150 гб в памяти. Например, когда у вас есть один исполнитель, вы, очевидно, не будете пользоваться параллельными возможностями Spark, но он просто начнет с первой задачи, обработает данные и сохранит их обратно в dfs и начнет работать с следующая задача.

Что вы должны проверить:

  • Насколько велики входные перегородки? Is the input file splittable at all? Если одному исполнителю приходится загружать огромный объем памяти, он наверняка исчерпает память.
  • Какие действия вы выполняете? Например, если вы выполняете соединение с очень низкой мощностью, вы получаете массивные разделы, потому что все строки с определенным значением попадают в одни и те же разделы.
  • Выполнены очень дорогие или неэффективные действия?Любой декартовый продукт и т. Д.

Надеюсь, это поможет. Счастливые искры!

2

При использовании нити, есть еще один параметр, который фигурирует в то, как большой, чтобы сделать запрос пряжи контейнер для ваших исполнителей:

spark.yarn.executor.memoryOverhead 

значение по умолчанию равно 0,1 * Ваша установка исполнитель памяти. Он определяет, сколько дополнительной служебной памяти нужно запрашивать в дополнение к тому, что вы указываете в качестве вашей памяти исполнителя. Сначала попробуйте увеличить этот номер.

Кроме того, контейнер для пряжи не даст вам памяти о произвольном размере. Он будет возвращать только контейнеры, выделенные с объемом памяти, кратное из его минимального размера распределения, который находится под контролем этого параметром:

yarn.scheduler.minimum-allocation-mb 

Установка, что меньшее число уменьшит риск вас «перескок» сумму, которую вы просили.

Я также, как правило, устанавливаю нижнюю клавишу в значение, большее, чем мой желаемый размер контейнера, чтобы гарантировать, что запрос искры контролирует, насколько велики мои исполнители, вместо того, чтобы прясть топать на них. Это максимальная пряжа размера контейнера выдаст.

nodemanager.resource.memory-mb