Диагностика и примеры устранения проблем производительности Spark-приложений
Если вы столкнулись с медленной работой Spark-приложений:
- Проверьте их работу, чтобы установить причину проблем с производительностью.
- Попробуйте воспользоваться одним из примеров устранения проблем производительности.
Первичная диагностика производительности Spark-приложений
Если производительность Spark-приложения низкая, проведите первичную диагностику:
-
Проверьте состояние кластера и его хостов и убедитесь, что значения метрик в пределах нормы.
-
Посмотрите подробную информацию о приложении и проверьте состояние заданий, моменты фактического начала и завершения их выполнения на диаграмме Event Timeline:
- определите задания, которые занимают больше всего времени;
- ознакомьтесь с заданиями, которые завершились ошибкой, и выясните причины сбоя;
- проанализируйте общее время выполнения приложения;
- проверьте последовательность выполнения действий.
-
Посмотрите подробную информацию о стадиях выполнения:
- определите стадии, которые занимают больше всего времени;
- проанализируйте shuffle-операции для выявления избыточного перемещения данных;
- обратите внимание на метрику GC Time — высокое значение может указывать на проблемы с памятью;
- посмотрите DAG Visualization для понимания последовательности и зависимости между операциями.
-
Проверьте выделенные для приложения ресурсы:
- Убедитесь, что приложению доступно достаточно исполнителей и доступные исполнители не простаивают.
- Убедитесь, что ресурсы в рамках одного исполнителя используются сбалансированно.
-
Проверьте планы SQL-запросов и продолжительность выполнения отдельных операций.
Примеры устранения проблем производительности Spark-приложений
Медленная загрузка данных из S3
Проблема: долгое выполнение Spark-приложения.
Шаги диагностики
-
Выявите проблемное задание.
- Откройте вкладку Jobs в Spark History Server.
- Сравните Duration между разными заданиями.
- Найдите задание, которое занимает больше всего времени.
-
Проанализируйте стадии проблемного задания.
- Перейдите в проблемное задание и откройте вкладку Stages.
- Отсортируйте стадии по Duration.
- Проанализируйте стадии, которые занимают больше всего времени.
- Проверьте метрики Input Size для определения объема читаемых данных.
Итог: обнаружена стадия, отвечающая за чтение данных из S3.
-
Проверьте метрики мониторинга кластера.
Проверьте метрики, связанные с vCPU.
Итог: обнаружена почти полная загрузка vCPU во время стадии чтения данных.
Загрузка данных из S3 осуществляется через интернет, она ограничена доступными vCPU-ресурсами. Чем больше vCPU доступно, тем быстрее Spark может обрабатывать входящий поток данных.
Решение проблемы
Для устранения проблемы рекомендуется увеличить количество vCPU у хостов кластера.
Плохой параллелизм на кластере с большим количеством vCPU
Проблема: неэффективное использование vCPU-ресурсов из-за недостаточного количества операций (tasks), что приводит к простою части ядер и увеличению времени выполнения.
Шаги диагностики
-
Проверка утилизации ресурсов кластера.
Проверьте конфигурацию кластера и доступные vCPU-ресурсы.
-
Анализ стадий в Spark History Server.
- Откройте вкладку Stages в Spark History Server.
- Отсортируйте стадии по Duration (длительности).
- Выберите самую долгую стадию.
- Обратите внимание на колонку Total Tasks — общее количество операций в стадии.
- Проверьте соотношение количества операций к количеству доступных vCPU.
Итог: обнаружена стадия с недостаточным количеством операций. Какие-то ядра выполняют по одной задаче, а какие-то — по две. Часть ядер простаивает.
Решение проблемы
Для устранения проблемы рекомендуется разбивать стадии на более мелкие подоперации. Увеличьте количество партиций для shuffle-операций с помощью настройки свойства spark.sql.shuffle.partitions, чтобы распределение работы было более равномерным.