如果Spark支持内存溢出到磁盘,那么Spark Out of Memory怎么会发生呢?

Jas*_*eng 6 apache-spark

我读了一些关于Spark内存管理的文档。

\n\n

在此页面上:如果我没有足够的内存,spark 会做什么?。它说:

\n\n
\n

Spark将分区存储在内存中的LRU缓存中。当缓存达到其大小限制时,它会从中逐出条目(即分区)。当分区具有 \xe2\x80\x9cdisk\xe2\x80\x9d 属性(即您的持久性级别允许在磁盘上存储分区)时,它将被写入 HDD 并且它消耗的内存将被释放,除非您请求它。当您请求它时,它将被读入内存,如果没有足够的内存,则缓存中的其他较旧条目将被逐出。如果您的分区没有 \xe2\x80\x9cdisk\xe2\x80\x9d 属性,则逐出仅意味着销毁缓存条目而不将其写入 HDD。

\n
\n\n

那么如果内存不够的话分区会溢出到磁盘,那么Spark运行时怎么会出现内存不足的问题呢?

\n

小智 5

Spark 只能逐出缓存的 RDD 块。也就是说,如果存在应用程序标记为存储在内存中的 RDD。因此,可以清除存储器的存储部分,但不能清除执行部分。Spark 内存管理指出

执行内存是指用于洗牌、连接、排序和聚合中的计算的内存。

以及他们是否可以被驱逐

由于实现的复杂性,存储可能不会驱逐执行。

如果JVM可用的内存量小于所需的执行内存,必然会发生OOM。

  • >>“因此内存的存储部分可以被清除,但不能清除执行部分”我礼貌地质疑这个说法,你提到的文档说存储部分不能逐出执行部分,而是会基于 LRU 逐出存储部分。但是,如果所有执行程序内存都被执行数据占用,则进一步需要时,执行数据可以溢出到磁盘。根据 https://www.youtube.com/watch?v=dPHrykZL8Cg(7:11),执行数据也可以溢出到磁盘。 (2认同)