Рекомендации по настройке производительности для Spark в HDInsight и Azure Data Lake Storage 1-го поколения

При настройке производительности для Spark необходимо учитывать количество приложений, которые будут выполняться в кластере. По умолчанию в кластере HDI можно одновременно выполнять четыре приложения (эту настройку по умолчанию можно изменить). Вам может понадобиться использовать меньшее количество приложений. В таком случае можно переопределить параметры по умолчанию и использовать больше ресурсов кластера для этих приложений.

Предварительные требования

Параметры

Ниже приведены самые важные параметры, которые можно настроить для повышения производительности в Data Lake Storage 1-го поколения при выполнении заданий Spark.

  • num-executors — количество параллельных задач, которые можно выполнить.

  • executor-memory — объем памяти, выделенной для каждого исполнителя.

  • executor-cores — количество ядер, выделенных для каждого исполнителя.

num-executors.Этот параметр позволяет задать максимальное число задач, которые могут выполняться параллельно. Фактическое число задач, которые могут выполняться параллельно, ограничено ресурсами памяти и ЦП, доступными в кластере.

executor-memory — это объем памяти, выделенной для каждого исполнителя. Объем памяти, необходимый для каждого исполнителя, зависит от задания. При выполнении сложных операций требования к памяти возрастают. Для более простых операций, таких как чтение и запись, требования к памяти ниже. Объем памяти, необходимый для каждого исполнителя, можно просмотреть в Ambari. В Ambari перейдите к Spark и откройте вкладку конфигураций.

executor-cores. Этот параметр задает количество ядер, используемых для каждого исполнителя, что определяет число параллельных потоков, выполняемых на исполнителя. Например, если задать executor-cores = 2, тогда каждый исполнитель может выполнять 2 параллельные задачи. Необходимое количество ядер исполнителя зависит от задания. Задания, включающие большое количество операций ввода-вывода, не требуют большого объема памяти на задачу, так что каждый исполнитель может обрабатывать большее количество параллельных задач.

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

Руководство

Во время выполнения аналитических рабочих нагрузок Spark для работы с данными в Data Lake Storage 1-го поколения рекомендуется использовать последнюю версию HDInsight для обеспечения высокой производительности Data Lake Storage 1-го поколения. Если во время вашего задания выполняется большое количество операций ввода-вывода, можно настроить некоторые параметры для повышения производительности. Data Lake Storage 1-го поколения — это высокомасштабируемая платформа хранилища, способная справиться с высокой пропускной способностью. Если задание состоит преимущественно из операций чтения или записи, повысить производительность можно, увеличив значение параметра параллелизма для операций ввода-вывода в Data Lake Storage 1-го поколения и из него.

Есть несколько основных способов повышения параллелизма для заданий с большим количеством операций ввода-вывода.

Шаг 1. Определение количества приложений, выполняющихся в кластере. Необходимо знать количество выполняющихся в кластере приложений, включая текущее. Значения по умолчанию для каждого параметра Spark подразумевают, что параллельно выполняются 4 приложения. Таким образом на каждое приложение доступно всего 25 % ресурсов кластера. Чтобы получить более высокую производительность, можно переопределить значения по умолчанию, изменив число исполнителей.

Шаг 2. Настройка памяти исполнителя. В первую очередь необходимо задать параметр executor-memory. Требуемый объем памяти зависит от задания, которое необходимо выполнить. Значение параметра параллелизма можно увеличить, выделив меньший объем памяти на каждый исполнитель. Если во время выполнения задания возникают исключения памяти, можно повысить значение для этого параметра. Альтернативой будет обеспечить больший объем памяти, используя кластер с большим объемом памяти или увеличивая размер кластера. Больший объем памяти позволит использовать дополнительные исполнители, обеспечивая возможность параллельной обработки.

Шаг 3. Настройка ядер исполнителя. Для рабочих нагрузок с большим количеством операций ввода-вывода, которые не включают сложные операции, рекомендуется настроить большее количество ядер исполнителя, чтобы увеличить число параллельно выполняемых задач на каждый исполнитель. Оптимальный вариант — 4 ядра исполнителя.

executor-cores = 4

Увеличение количества ядер исполнителя обеспечит больший параллелизм, так что можно поэкспериментировать с разным количеством ядер. Для заданий, которые включают более сложные операции, количество ядер на исполнитель необходимо уменьшить. Если количество ядер исполнителя превышает 4, тогда сборка мусора может оказаться неэффективной и производительность снизится.

Шаг 4. Определение объема памяти YARN в кластере. Информация об этом доступна в Ambari. Перейдите к YARN и откройте вкладку конфигураций. Объем памяти YARN отобразится в этом окне. Примечание. В этом окне можно увидеть размер контейнера YARN по умолчанию. Размер контейнера YARN совпадает со значением параметра объема памяти на исполнителя.

Общий объем памяти YARN = число узлов × объем памяти YARN на узел

Шаг 5. Вычисление параметра num-executors

Вычисление ограничения памяти. Параметр num-executors ограничен памятью или ЦП. Ограничение памяти определяется объемом доступной памяти YARN для вашего приложения. Разделите общий объем памяти YARN на значение executor-memory. Ограничение необходимо рассчитать для каждого приложения, так что мы разделим полученное значение на количество приложений.

Ограничение памяти = (общий объем памяти YARN / память исполнителя) / число приложений

Вычисление ограничения ЦП. Ограничение ЦП можно рассчитать, разделив общее количество виртуальных ядер на количество ядер на исполнителя. Для каждого физического ядра существует 2 виртуальных ядра. Как и в случае с ограничением памяти, необходимо делить на количество приложений.

Число виртуальных ядер = (узлы в кластере × количество физических ядер на один узел × 2) Ограничение ЦП = (общее число виртуальных ядер / количество ядер на исполнителя) / число приложений

Настройка параметра num-executors. Параметр num-executors определяется минимальным значением ограничения памяти и ограничением ЦП.

Число исполнителей (num-executors) = минимальное из значений (всего виртуальных ядер / количество ядер на исполнителя, доступная память YARN / память исполнителя) Увеличение количества исполнителей не обязательно приводит к повышению производительности. Следует учитывать, что добавление дополнительных исполнителей ведет к соответствующему увеличению нагрузки для каждого дополнительного исполнителя, что может снизить производительность. Параметр num-executors ограничен ресурсами кластера.

Пример вычисления

Предположим, у вас есть кластер из 8 узлов D4v2, на котором выполняется два приложения, включая приложение, которое вы собираетесь выполнить.

Шаг 1. Определите, сколько приложений выполняется в кластере. Вы знаете, что в кластере выполняется два приложения, включая приложение, которое вы собираетесь выполнить.

Шаг 2. Задайте параметр executor-memory. Для данного примера мы определяем, что 6 ГБ памяти на исполнитель будет достаточно для выполнения задания с большим количеством операций ввода-вывода.

executor-memory = 6GB

Шаг 3. Задайте параметр executor-cores. Так как это задание с большим количеством операций ввода-вывода, для каждого исполнителя можно задать четыре ядра. Если задать большее количество ядер на один исполнитель, это может вызвать проблемы со сборкой мусора.

executor-cores = 4

Шаг 4. Определите объем памяти YARN в кластере. Перейдите в Ambari, чтобы узнать, что каждый узел D4v2 имеет 25 ГБ памяти YARN. Так как в кластере 8 узлов, объем доступной памяти YARN увеличивается в 8 раз.

Общий объем памяти YARN = число узлов × объем памяти YARN* на один узел Общий объем памяти YARN = 8 узлов × 25 ГБ = 200 ГБ

Шаг 5. Настройте параметр num-executors. Параметр num-executors определяется общим минимальным значением ограничения памяти и ограничением ЦП, разделенными на количество приложений, выполняемых в Spark.

Рассчитайте ограничение памяти. Ограничение памяти рассчитывается как общий объем памяти YARN, разделенный на объем памяти на исполнитель.

Ограничение памяти = (общий объем памяти YARN / память исполнителя) / число приложений Ограничение памяти = (200 ГБ / 6 ГБ) / 2 = 16 (округлено) Рассчитайте ограничение ЦП. Ограничение ЦП можно рассчитать, разделив общее количество ядер YARN на количество ядер на исполнителя.

Число ядер YARN = количество узлов в кластере × число ядер на узел × 2 Число ядер YARN = 8 узлов × 8 ядер на D14 × 2 = 128 Ограничение ЦП = (общее число ядер YARN / количество ядер на исполнителя) / число приложений Ограничение ЦП = (128 / 4) / 2 = 16

Настройте параметр num-executors.

num-executors = наименьшее из значений (ограничение памяти, ограничение ЦП) num-executors = наименьшее из значений (16, 16) = 16