Я прочитал несколько документов об управлении памятью Spark.
На этой странице: Что будет делать spark, если у меня недостаточно памяти?. В нем говорится:
Spark stores partitions in LRU cache in memory. When cache hits its limit in size, it evicts the entry (i.e. partition) from it. When the partition has “disk” attribute (i.e. your persistence level allows storing partition on disk), it would be written to HDD and the memory consumed by it would be freed, unless you would request it. When you request it, it would be read into the memory, and if there won’t be enough memory some other, older entries from the cache would be evicted. If your partition does not have “disk” attribute, eviction would simply mean destroying the cache entry without writing it to HDD.
Тогда, если разделы могут переноситься на диск, если памяти недостаточно, как может возникнуть проблема с нехваткой памяти при работе Spark?
Spark может вытеснять только кэшированные блоки RDD. Это если есть RDD, которые приложение пометило для хранения в памяти. Таким образом, часть памяти для хранения может быть очищена, но не часть для выполнения. Управление искровой памятью утверждает, что
Execution memory refers to that used for computation in shuffles, joins, sorts and aggregations.
И можно ли их выселить или нет
Storage may not evict execution due to complexities in implementation.
Если объем памяти, доступной для JVM, меньше требуемой памяти для выполнения, OOM обязательно произойдет.
@VikashPareek что, если исполнитель имеет дело с разливом в случайном порядке, а пара K-V, с которой мы сейчас имеем дело, огромна по размеру, прежде чем исполнитель сможет даже разлить на диск? Я полагаю, это может вызвать OOM? Я также ищу ответы на этот вопрос, возможно, поделитесь своим мнением.
>> «Таким образом, часть памяти для хранения может быть очищена, но не часть для выполнения». Я вежливо оспариваю это утверждение, в документе, на который вы ссылаетесь, говорится, что часть для хранения не может вытеснить часть для выполнения, а вытеснит часть для хранения на основе LRU. Но если вся память исполнителя занята исполняемыми данными, то при дальнейшей необходимости исполнительные данные могут быть сброшены на диск. Согласно youtube.com/watch?v=dPHrykZL8Cg (в 7:11), данные выполнения также могут быть перенесены на диск.