[Документация Yandex Cloud](../../index.md) > [Yandex Managed Service for Apache Spark™](../index.md) > [Пошаговые инструкции](index.md) > Логи и мониторинг > Диагностика и примеры устранения проблем производительности Spark-приложений

# Диагностика и примеры устранения проблем производительности Spark-приложений

Если вы столкнулись с медленной работой Spark-приложений:

* [Проверьте их работу](#diagnostics), чтобы установить причину проблем с производительностью.
* Попробуйте воспользоваться одним из [примеров устранения проблем производительности](#examples-scenarios).

## Первичная диагностика производительности Spark-приложений {#diagnostics}

Если производительность Spark-приложения низкая, проведите первичную диагностику:

* [Проверьте состояние кластера и его хостов](monitoring.md) и убедитесь, что значения метрик в пределах нормы.
* [Посмотрите подробную информацию о приложении](spark-monitoring.md#info) и проверьте состояние заданий, моменты фактического начала и завершения их выполнения на диаграмме **Event Timeline**:
   * определите задания, которые занимают больше всего времени;
   * ознакомьтесь с заданиями, которые завершились ошибкой, и выясните причины сбоя;
   * проанализируйте общее время выполнения приложения;
   * проверьте последовательность выполнения действий.

* [Посмотрите подробную информацию о стадиях выполнения](spark-monitoring.md#stages):
   * определите стадии, которые занимают больше всего времени;
   * проанализируйте shuffle-операции для выявления избыточного перемещения данных;
   * обратите внимание на метрику **GC Time** — высокое значение может указывать на проблемы с памятью;
   * посмотрите **DAG Visualization** для понимания последовательности и зависимости между операциями.

* [Проверьте выделенные для приложения ресурсы](spark-monitoring.md#resources):
    * Убедитесь, что приложению доступно достаточно исполнителей и доступные исполнители не простаивают.
    * Убедитесь, что ресурсы в рамках одного исполнителя используются сбалансированно.

* [Проверьте планы SQL-запросов](spark-monitoring.md#sql) и продолжительность выполнения отдельных операций.

## Примеры устранения проблем производительности Spark-приложений {#examples-scenarios}

### Медленная загрузка данных из S3 {#s3-long}

Проблема: долгое выполнение Spark-приложения.

#### Шаги диагностики

1. Выявите проблемное задание.
   
   * Откройте вкладку **Jobs** в **Spark History Server**.
   * Сравните **Duration** между разными заданиями.
   * Найдите задание, которое занимает больше всего времени.

1. Проанализируйте стадии проблемного задания.

   * Перейдите в проблемное задание и откройте вкладку **Stages**.
   * Отсортируйте стадии по **Duration**.
   * Проанализируйте стадии, которые занимают больше всего времени.
   * Проверьте метрики **Input Size** для определения объема читаемых данных.

   Итог: обнаружена стадия, отвечающая за чтение данных из S3.

1. Проверьте метрики мониторинга кластера.

   Проверьте метрики, связанные с vCPU.

   Итог: обнаружена почти полная загрузка vCPU во время стадии чтения данных.

Загрузка данных из S3 осуществляется через интернет, она ограничена доступными vCPU-ресурсами. Чем больше vCPU доступно, тем быстрее Spark может обрабатывать входящий поток данных.

#### Решение проблемы

Для устранения проблемы рекомендуется увеличить количество vCPU у хостов кластера.

### Плохой параллелизм на кластере с большим количеством vCPU {#bad-parallelism}

Проблема: неэффективное использование vCPU-ресурсов из-за недостаточного количества операций (tasks), что приводит к простою части ядер и увеличению времени выполнения.

#### Шаги диагностики

1. Проверка утилизации ресурсов кластера.

   Проверьте конфигурацию кластера и доступные vCPU-ресурсы.

1. Анализ стадий в **Spark History Server**.
   
   * Откройте вкладку **Stages** в **Spark History Server**.
   * Отсортируйте стадии по **Duration** (длительности).
   * Выберите самую долгую стадию.
   * Обратите внимание на колонку **Total Tasks** — общее количество операций в стадии.
   * Проверьте соотношение количества операций к количеству доступных vCPU.

   Итог: обнаружена стадия с недостаточным количеством операций. Какие-то ядра выполняют по одной задаче, а какие-то — по две. Часть ядер простаивает.

#### Решение проблемы

Для устранения проблемы рекомендуется разбивать стадии на более мелкие подоперации. Увеличьте количество партиций для shuffle-операций с помощью настройки [свойства](../concepts/spark-properties.md) `spark.sql.shuffle.partitions`, чтобы распределение работы было более равномерным.