Мониторинг памяти выполнения Spark
Я хочу иметь возможность отслеживать память выполнения Spark, а не память, доступную в SparkUI. Я имею в виду, память выполнения НЕ память исполнителя.
Под памятью выполнения я имею в виду:
Этот регион используется для буферизации промежуточных данных при выполнении перемешиваний, объединений, сортировок и агрегации. Размер этого региона настраивается через spark.shuffle.memoryFraction (по умолчанию 0.2). Согласно: Унифицированное управление памятью в Spark 1.6
После интенсивного поиска ответов я не нашел ничего, кроме оставшихся без ответа вопросов Stackru, ответов, которые касаются только памяти, или ответов с неопределенными типами, использующими Ganglia, консолью Cloudera и т. Д.
Кажется, существует потребность в этой информации о переполнении стека, но пока нет ни одного удовлетворительного ответа. Вот некоторые главные сообщения Stackru при поиске мониторинга искровой памяти
Мониторинг выполнения Spark и использования памяти
Мониторинг использования памяти Spark Jobs
СПАРК: Как контролировать потребление памяти на кластере Спарк?
Spark - отслеживать фактическую память исполнителя
Как я могу контролировать использование памяти и процессора при использовании приложения spark?
Как получить память и использование процессора приложением Spark?
Вопросы
Версия Spark> 2.0
Можно ли отслеживать память выполнения задания Spark? Под мониторингом я имею в виду, как минимум, видеть использованную / доступную, как и память для каждого исполнителя, на вкладке "Исполнитель" в SparkUI. Да или нет?
Могу ли я сделать это с SparkListeners (@JacekLaskowski?) Как насчет истории сервера? Или единственный способ - через внешние инструменты? Графана, Ганглия, другие? Если внешние инструменты, не могли бы вы указать на учебник или предоставить более подробные рекомендации?
Я видел, что использование SPARK-9103 отслеживающей искры похоже на то, что пока невозможно контролировать память выполнения. Также это актуально для SPARK-23206 Метрики настройки дополнительной памяти.
Есть ли
Peak Execution memory
достоверная оценка использования / заполнения оперативной памяти в задаче? Если, например, пользовательский интерфейс рабочей области говорит, что задача использует максимум 1 ГБ, а у меня по 5 процессоров на исполнителя, значит ли это, что для выполнения этапа мне нужно по крайней мере 5 ГБ памяти на каждого исполнителя?Есть ли другие прокси, которые мы могли бы использовать, чтобы получить представление о памяти выполнения?
Есть ли способ узнать, когда память выполнения начинает кушать в памяти? Когда моя кэшированная таблица исчезает со вкладки "Хранилище" в SparkUI или остается только ее часть, означает ли это, что она была удалена из памяти выполнения?
1 ответ
Отвечая на мой вопрос для дальнейшего использования:
Мы используем Mesos в качестве менеджера кластера. В пользовательском интерфейсе Mesos я нашел страницу со списком всех исполнителей данного работника, и там можно найти использование памяти исполнителем. Похоже, что общее использование памяти хранения + выполнение. Я ясно вижу, что, когда память заполняется, исполнитель умирает.
Для доступа:
- Перейдите на вкладку Агенты, где перечислены все работники кластера.
- Выберите работника
- Выберите Framework - тот, который с названием вашего скрипта
- Внутри у вас будет список исполнителей для вашей работы на этом конкретном работнике.
- Об использовании памяти см.: Mem (Used / Allocated)
Подобное можно сделать для водителя. Для каркаса вы выбираете тот с именем Spark Cluster
Если вы хотите узнать, как извлечь это число программно, посмотрите мой ответ на этот вопрос: Как получить память для Mesos Agents Framework Executor
Я включаю внутренние метрики Spark для исполнителя и могу получить информацию о JVMHeapMemory, jvm.heap.usage, OnHeapExecutionMemory, OnHeapStroageMemory и OnHeapUnifiedMemory для своих исследований. См. Документ (https://spark.apache.org/docs/3.0.0-preview/monitoring.html) для получения дополнительной информации.