Как решить вопрос о размерах контейнера для пряжи на искру?

Я хочу запустить некоторые задания pyspark на YARN. У меня есть 2 узла, каждый по 10 ГБ. Я могу открыть оболочку pyspark так: pyspark

Теперь, когда у меня есть очень простой пример, который я пытаюсь запустить:

import random
NUM_SAMPLES=1000
def inside(p):
    x, y = random.random(), random.random()
    return x*x + y*y < 1

count = sc.parallelize(xrange(0, NUM_SAMPLES)) \
             .filter(inside).count()
print "Pi is roughly %f" % (4.0 * count / NUM_SAMPLES)

В результате получается очень длинный журнал искры с выходом ошибки. Наиболее важная информация:

ERROR cluster.YarnScheduler: Lost executor 1 on (ip>: Container marked as failed: <containerID> on host: <ip>. Exit status 1.  Diagnostics: Exception from container-launch.  ......

далее в журналах, которые я вижу...

ERROR scheduler.TaskSetManager: Task 0 in stage 0.0 failed 1 times: aborting job
INFO cluster.YarnClientSchedulerBackend: Asked to remove non-existent executor 1
INFO spark.ExecutorAllocationManager: Existing executor 1 has been removed (new total is 0)

Из того, что я собираю из журналов выше, это, по-видимому, проблема размера контейнера в пряже.

Мой yarn-site.xml файл имеет следующие настройки:

yarn.scheduler.maximum-allocation-mb = 10240
yarn.nodemanager.resource.memory-mb = 10240

и в spark-defaults.conf содержит:

spark.yarn.executor.memoryOverhead=2048
spark.driver.memory=3g

Если есть другие настройки, о которых вы хотели бы узнать, сообщите мне.

Как настроить размер контейнера в пряже?
(щедрость на пути для тех, кто может мне помочь)

Ответ 1

Позвольте мне сначала объяснить базовый набор свойств, необходимых для настройки вашего искрового приложения на кластере YARN.

Примечание. Контейнер в YARN эквивалентен Executor in Spark. Для понятности вы можете подумать, что оба они одинаковы.

На пряжи-site.xml:

yarn.nodemanager.resource.memory-mb - общая память, доступная кластеру из заданного node.

yarn.nodemanager.resource.cpu-vcores - общее количество процессоров, доступных для кластера из заданного node.

yarn.scheduler.maximum-allocation-mb - максимальная память в мб, которая должна быть назначена для каждого контейнера пряжи.

yarn.scheduler.maximum-allocation-vcores - максимальное количество vcores, которое может быть выделено за контейнер пряжи.

Пример: Если node имеет 16GB и 8vcores, и вы хотели бы внести 14GB и 6vcores в кластер (для контейнеров), затем установите свойства, как показано ниже:

yarn.nodemanager.resource.memory-mb: 14336 (14 ГБ)

yarn.nodemanager.resource.cpu-vcores: 6

И для создания контейнеров с 2GB и 1vcore каждый, установите следующие свойства:

yarn.scheduler.maximum-allocation-mb: 2049

yarn.scheduler.maximum-allocation-vcores: 1

Примечание.. Несмотря на то, что для создания 7 контейнеров с 2 ГБ имеется достаточно памяти (14 ГБ), в конфигурации выше будет создано только 6 контейнеров с 2 ГБ, а в кластер будет использоваться только 12 ГБ из 14 ГБ. Это связано с тем, что для кластера доступно только 6vcores.

Теперь на стороне искры,

Ниже свойств указывается запрашиваемая память для каждого исполнителя/контейнера

spark.driver.memory

spark.executor.memory

Ниже свойств указывается количество запросов для каждого исполнителя/контейнера

spark.driver.cores

spark.executor.cores

IMP: Все свойства памяти Spark и vcore должны быть меньше или равны конфигурации YARN

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

spark.executor.instances

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

Как только конфигурация пряжи будет завершена, искра должна запросить контейнеры , которые могут быть назначены на основе конфигураций YARN. Это означает, что если YARN настроен на выделение максимум 2 ГБ на контейнер, а Spark запрашивает контейнер с памятью 3 ГБ, то задание остановится или остановится, потому что YARN не может удовлетворить запрос искры.

Теперь для вашего варианта использования: Обычно настройка кластеров основана на рабочих нагрузках. Но ниже config должен быть более подходящим.

Доступная память: 10 ГБ * 2 узла Доступны Vcores: 5 * 2 vcores [Успение]

На пряжи-site.xml [В обоих узлах]

yarn.nodemanager.resource.memory-mb: 10240

yarn.nodemanager.resource.cpu-vcores: 5

yarn.scheduler.maximum-allocation-mb: 2049

yarn.scheduler.maximum-allocation-vcores: 1

Используя вышеприведенную конфигурацию, вы можете создать максимум 10 контейнеров на каждом из узлов, имеющих 2 ГБ, 1vcore для каждого контейнера.

Конфигурация Spark

spark.driver.memory 1536mb

spark.yarn.executor.memoryOverhead 512mb

spark.executor.memory 1536mb

spark.yarn.executor.memoryOverhead 512mb

spark.driver.cores 1

spark.executor.cores 1

spark.executor.instances 19

Пожалуйста, не стесняйтесь играть в эти конфигурации в соответствии с вашими потребностями.