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

时间:2019-04-10 05:47:25

标签: apache-spark

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

在此页面上:What will spark do if I don't have enough memory?。它说:

  

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

然后,如果内存不足时分区可能溢出到磁盘,那么在运行Spark时怎么会发生内存不足的问题?

2 个答案:

答案 0 :(得分:1)

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

  

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

以及他们是否可以被驱逐

  

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

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

答案 1 :(得分:0)

我也有类似的问题。好奇地知道答案。

如果我有一个10GB的文件和一个2GB的内存,并且如果将10GB的文件读入单个分区,则显然无法容纳该内存。因此,我认为在这种情况下,它将因OOM异常而失败。但是,如果将文件读取到10个分区(每个分区1GB)中,则它将一次执行一个分区,其余分区则溢出到磁盘上。 spark一次从磁盘上拾取每个分区,然后处理1GB分区。因此,要完成10GB文件的处理需要10次。有人可以纠正我吗?

即使将10GB的文件划分为2个分区,每个分区5GB,其中一个分区也可以溢出到磁盘上,但是另一个分区应该适合内存以进行处理。由于5GB无法容纳2GB,因此我认为OOM异常。我相信,不会发生从5GB分区加载部分数据和同一分区的部分数据溢出的情况。