Оптимизация приложений Apache Spark в HDInsight
В этой статье приводятся общие сведения о стратегиях оптимизации приложений Apache Spark в Azure HDInsight.
Обзор
Вы можете столкнуться со следующими распространенными сценариями
- Одно и то же задание Spark выполняется медленнее, чем раньше, в том же кластере HDInsight
- Задание Spark выполняется медленнее в кластере HDInsight, чем в локальной среде или у другого стороннего поставщика услуг
- В одном кластере HDI задание Spark выполняется медленнее, чем в другом
Производительность заданий Apache Spark зависит от нескольких факторов. Вот неполный список этих факторов.
- Способ хранения данных
- Способ настройки кластера
- Операции, используемые при обработке данных.
- Неработоспособная служба yarn
- Ограничения памяти из-за неправильного размера исполнителей и ошибки нехватки памяти (OutOfMemoryError)
- Слишком много или слишком мало задач
- Неравномерное распределение данных, вызванное несколькими ресурсоемкими или медленно выполняемыми задачами
- Более медленное выполнение задач на неэффективных узлах
Шаг 1. Проверка работоспособности службы yarn
- Перейдите в пользовательский интерфейс Ambari.
- Проверьте наличие оповещений ResourceManager или NodeManager
- Проверьте состояние ResourceManager и NodeManager в YARN > SUMMARY (Сводка): состояние "Запущено" должно быть у всех NodeManager, но только у активного ResourceManager
Проверьте, доступен ли пользовательский интерфейс Yarn через
https://YOURCLUSTERNAME.azurehdinsight.net/yarnui/hn/cluster
Проверьте наличие исключений или ошибок в журнале ResourceManager в
/var/log/hadoop-yarn/yarn/hadoop-yarn-resourcemanager-*.log
Подробнее см. в статье Распространенные проблемы Yarn
Шаг 2. Сравнение новых ресурсов приложения с доступными ресурсами yarn
Перейдите в пользовательский интерфейс Ambari > YARN > SUMMARY (Сводка), проверьте CLUSTER MEMORY (Память кластера) в ServiceMetrics
Тщательно просмотрите метрики очереди 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 следует использовать учетную запись администратора домена.
- Вычислите общий объем ресурсов для нового приложения
- Все ресурсы исполнителей:
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
- Сравните общий объем ресурсов нового приложения с доступными ресурсами yarn в указанной очереди
Шаг 3. Отслеживание приложения Spark
Необходимо определить следующие симптомы с помощью пользовательского интерфейса Spark или пользовательского интерфейса журналов Spark:
- Какой этап медленный
- Полностью ли используются все виртуальные ядра ЦП исполнителя в Event-Timeline на вкладке Этап
- При использовании Spark SQL какой физический план отображается на вкладке SQL
- Долго ли выполняется DAG на одном из этапов
- Изучите метрики задач (размер входных данных, размер записи в случайном порядке, длительность сборки мусора) на вкладке Этап
Подробнее см. в разделе Отслеживание приложений Spark
Шаг 4. Оптимизация приложения Spark
Существует много способов оптимизации (например, кэширование), которые помогут преодолеть эти проблемы с учетом неравномерного распределения данных.
В каждой из следующих статей можно найти сведения о различных аспектах оптимизации Spark.
- Оптимизация хранилища данных для Apache Spark
- Оптимизация обработки данных для Apache Spark
- Оптимизация потребления памяти для Apache Spark
- Оптимизация конфигурации кластера HDInsight для Apache Spark
Оптимизация секций Spark SQL
-
spark.sql.shuffle.paritions
по умолчанию имеет значение 200. Его можно настроить согласно бизнес-потребностям при записи данных в случайном порядке для соединений или агрегатов. -
spark.sql.files.maxPartitionBytes
по умолчанию имеет значение 1 Г в HDI. Максимальное число байтов для упаковки в одну секцию при чтении файлов. Эта конфигурация действует только при использовании файловых источников, таких как Parquet, JSON и ORC. - AQE в Spark 3.0. См. статью Адаптивное выполнение запросов