Оптимизация приложений 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 > SUMMARY (Сводка): состояние "Запущено" должно быть у всех 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:

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

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

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

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

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

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

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

Дальнейшие действия