Модуль драйвера Spark уничтожен со статусом ‘неубиваемый’

#apache-spark #kubernetes #out-of-memory #spark-streaming

#apache-spark #kubernetes #нехватка памяти #потоковая передача spark

Вопрос:

Мы запускаем потоковое приложение Spark в кластере Kubernetes с использованием spark 2.4.5. Приложение получает огромные объемы данных через раздел Kafka (по одному сообщению каждые 3 мс). используются 4 исполнителя и 4 раздела kafka.

Во время работы объем памяти модуля драйвера продолжает увеличиваться, пока он не будет уничтожен K8s со статусом ‘неубиваемый’. С памятью исполнителей не возникает никаких проблем.

При проверке ресурсов модуля драйвера с помощью этой команды :

 kubectl top pod podName
  

Мы можем видеть, что объем памяти увеличивается, пока не достигнет 1,4 ГБ, и модуль завершает работу.

Однако при проверке оперативной памяти драйвера в Spark UI мы можем видеть, что оперативная память используется не полностью (50,3 КБ / 434 МБ). Есть ли какая-либо разница между объемом оперативной памяти драйвера и памятью модуля, содержащего драйвер?

Был ли у кого-нибудь опыт с подобной проблемой раньше?

Буду признателен за любую помощь.

Вот еще несколько подробностей о приложении :

  • Версия Kubernetes: 1.18
  • Версия Spark: 2.4.5
  • Пакетный интервал контекста потоковой передачи spark: 5 секунд
  • Скорость ввода данных: 1 сообщение kafka каждые 3 мс
  • Язык Scala

Ответ №1:

Вкратце, память Spark состоит из трех частей:

  • Обратная память (300 МБ)
  • Пользовательская память (всего 300 МБ) * 0.4), используемая для логики обработки данных.
  • Память Spark ((всего-300 МБ) * 0.6( spark.memory.fraction ))), используемая для кэширования и перетасовки в Spark.

Помимо этого, в K8s также есть max(executor memory * 0.1, 384MB) ( 0.1 есть spark.kubernetes.memoryOverheadFactor ) дополнительная память, используемая памятью, отличной от JVM.

Добавление ограничения памяти исполнителя из-за накладных расходов на память в K8S должно исправить проблему.

Вы также можете уменьшить spark.memory.fraction , чтобы выделить больше оперативной памяти для памяти пользователя.