Поделиться через


Оптимизация приложений Apache Spark в HDInsight

В этой статье приводятся общие сведения о стратегиях оптимизации приложений Apache Spark в Azure HDInsight.

Обзор

Вы можете столкнуться со следующими распространенными сценариями

  • Одно и то же задание Spark выполняется медленнее, чем раньше, в том же кластере HDInsight
  • Задание Spark выполняется медленнее в кластере HDInsight, чем в локальной среде или у другого стороннего поставщика услуг
  • В одном кластере HDI задание Spark выполняется медленнее, чем в другом

Производительность заданий Apache Spark зависит от нескольких факторов. Эти факторы эффективности включают:

  • Способ хранения данных
  • Способ настройки кластера
  • Операции, используемые при обработке данных.
  • Неисправная служба "yarn"
  • Ограничения памяти из-за неправильно определённого размера исполнителей и ошибки нехватки памяти (OutOfMemoryError)
  • Слишком много или слишком мало задач
  • Перекос данных привел к нескольким ресурсоемким или медленным задачам.
  • Более медленное выполнение задач на неэффективных узлах

Шаг 1. Проверка работоспособности службы yarn

  1. Перейдите в пользовательский интерфейс Ambari.
  • Проверьте наличие уведомлений ResourceManager или NodeManager
  • Проверьте состояние ResourceManager и NodeManager в YARN > СВОДКА: все NodeManager должны быть в состоянии "Запущено", а только активный ResourceManager должен быть в состоянии "Запущено"
  1. Проверьте, доступен ли пользовательский интерфейс Yarn через https://YOURCLUSTERNAME.azurehdinsight.net/yarnui/hn/cluster

  2. Проверьте наличие исключений или ошибок в журнале ResourceManager в /var/log/hadoop-yarn/yarn/hadoop-yarn-resourcemanager-*.log

См. дополнительную информацию в разделе Распространенные проблемы Yarn

Шаг 2. Сравнение новых ресурсов приложения с доступными ресурсами yarn

  1. Перейдите в пользовательский интерфейс Ambari > YARN > SUMMARY (Сводка), проверьте CLUSTER MEMORY (Память кластера) в ServiceMetrics

  2. Тщательно просмотрите метрики очереди yarn в деталях:

  • Перейдите в пользовательский интерфейс Yarn, проверьте метрики планировщика Yarn с помощью https://YOURCLUSTERNAME.azurehdinsight.net/yarnui/hn/cluster/scheduler
  • Либо вы можете проверить метрики планировщика Yarn с помощью REST API Yarn. Например, curl -u "xxxx" -sS -G "https://YOURCLUSTERNAME.azurehdinsight.net/ws/v1/cluster/scheduler". Для ESP следует использовать учетную запись администратора домена.
  1. Вычислите общий объем ресурсов для нового приложения
  • Все ресурсы исполнителей: spark.executor.instances * (spark.executor.memory + spark.yarn.executor.memoryOverhead) and spark.executor.instances * spark.executor.cores. Подробнее см. в статье о конфигурации исполнителей Spark
  • ApplicationMaster
    • В режиме кластера используйте spark.driver.memory и spark.driver.cores
    • В режиме клиента используйте spark.yarn.am.memory+spark.yarn.am.memoryOverhead и spark.yarn.am.cores

Примечание.

yarn.scheduler.minimum-allocation-mb <= spark.executor.memory+spark.yarn.executor.memoryOverhead <= yarn.scheduler.maximum-allocation-mb

  1. Сравните общий объем ресурсов вашего нового приложения с доступными ресурсами Yarn в указанной очереди

Шаг 3. Отслеживание приложения Spark

  1. Отслеживайте работу запущенного приложения Spark с помощью пользовательского интерфейса Spark

  2. Отслеживайте работу завершенного или незавершенного приложения Spark с помощью пользовательского интерфейса сервера журналов Spark

Необходимо определить следующие симптомы с помощью пользовательского интерфейса Spark или пользовательского интерфейса журналов Spark:

  • Какой этап медленный
  • Используются ли полностью все виртуальные CPU-ядра исполнителя в хронологии событий на вкладке Этап
  • При использовании Spark SQL какой физический план отображается на вкладке SQL
  • Длина ли DAG слишком велика на одном этапе
  • Изучите метрики задач (размер входных данных, размер записи перестановки, время работы GC) на вкладке Этап

Подробнее см. в разделе Отслеживание приложений Spark

Шаг 4. Оптимизация приложения Spark

Существует много способов оптимизации (например, кэширование), которые помогут преодолеть эти проблемы с учетом неравномерного распределения данных.

В каждой из следующих статей можно найти сведения о различных аспектах оптимизации Spark.

Оптимизация секций Spark SQL

  • spark.sql.shuffle.partitions по умолчанию имеет значение 200. Мы можем настроить в соответствии с бизнес-потребностями при перестановке данных для объединений или агрегаций.
  • spark.sql.files.maxPartitionBytesпо умолчанию имеет значение 1 Г в HDI. Максимальное число байтов для упаковки в одну секцию при чтении файлов. Эта конфигурация действует только при использовании файловых источников, таких как Parquet, JSON и ORC.
  • AQE в Spark 3.0. См. статью Адаптивное выполнение запросов

Следующие шаги