#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
, чтобы выделить больше оперативной памяти для памяти пользователя.