2

Я использовал экземпляр AWS EMR 5.2 m4.2x большой с 10 узлами для запуска приложений Spark с использованием Spark 2.0.2. Я использовал свойство maximizeResourceAllocation=true. Я видел в искрового defaults.conf что там, где я увидел следующие свойства:Как распределить память памяти и памяти оператора при использовании Spark на Amazon EMR

spark.executor.instances   10 
spark.executor.cores    16 
spark.driver.memory    22342M 
spark.executor.memory   21527M 
spark.default.parallelism  320 

In пряжи site.xml, я видел yarn.nodemanager.resource.memory-mb=24576 (24 Гбайта) .I только понимать, что множество spark.executor.instances до 10, как Я использую кластер из 10 узлов. Но может ли кто-нибудь объяснить мне, как другие свойства были установлены так, как была рассчитана память драйвера &? Также я использовал свойство maximizeResourceAllocation=true. Как это влияет на память?

ответ

3

Предлагаю книгу Spark in Action. Короче говоря, исполнители - это контейнеры, которые запускают задачи, поставленные им драйвером. Один узел в кластере может запускать несколько исполнителей в зависимости от распределения ресурсов. Распределение CPU позволяет запускать задачи параллельно, поэтому лучше иметь больше ядер для исполнителей. Таким образом, больше ядер процессора означает больше слотов задач. Распределение памяти для исполнителей должно производиться разумным способом, который должен соответствовать памяти контейнера YARN. Ячейка контейнера YARN> = память исполнителя + служебная память.

Spark хранит части этой памяти для хранения данных в кэше и для временных данных перемешивания. Задайте кучу для них с параметрами spark.storage.memoryFraction (по умолчанию 0,6) и spark.shuffle.memoryFraction (по умолчанию 0,2). Поскольку эти части кучи могут расти до того, как Spark может измерить и ограничить их, необходимо установить два дополнительных параметра безопасности: spark.storage.safetyFraction (по умолчанию 0,9) и spark.shuffle.safetyFraction (по умолчанию 0,8). Параметры безопасности уменьшают долю памяти на указанную величину. Фактическая часть кучи, используемой для хранения по умолчанию, составляет 0,6 × 0,9 (доля безопасности умножается на долю памяти), что составляет 54%. Аналогично, часть кучи, используемой для данных тасования, составляет 0,2 × 0,8 (показатель безопасности, умноженный на долю памяти в случайном порядке), что составляет 16%. Затем у вас есть 30% кучи, зарезервированных для других объектов и ресурсов Java, необходимых для запуска задач. Вы должны, однако, рассчитывать только на 20%.

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

+0

Какая разница, если бы я не установил свойство 'maximizeResourceAllocation = true' ?? –

+0

Используется для расчета общего ресурса кластера и установки конфигураций по умолчанию на основе результата расчета. если эта опция не включена, некоторые параметры будут установлены на значение по умолчанию, например 'spark.default.parallelism = 100' – FaigB