Перейти к содержимому
11 / 15

Память исполнителя: из чего складывается и почему приходит OOM

Память исполнителя делится на несколько независимых частей, и падение в каждой выглядит по-разному. spark.executor.memory задаёт кучу JVM; внутри неё spark.memory.fraction (0.6) отводится под единый пул выполнения и хранения, а оставшиеся 40% — под пользовательские структуры и внутренние нужды Spark. Внутри пула spark.memory.storageFraction (0.5) определяет долю, которую кэш может удерживать гарантированно: сверх неё выполнение вытеснит кэш, а вот кэш выполнение вытеснить не может. Отдельно живёт spark.executor.memoryOverhead — память вне кучи под сетевые буферы и нативный код, по умолчанию максимум из 384 МБ и 10% от кучи; именно её не хватает, когда контейнер убивают по лимиту. И совсем отдельно — Python-процессы PySpark: они живут вне JVM, и типичный OOM в PySpark случается именно там, а не в куче. Ограничить их можно через spark.executor.pyspark.memory, но по умолчанию он не задан, и тогда их аппетит списывается с бюджета memoryOverhead.

Память исполнителя: из чего складывается и почему приходит OOM | JScriptiser