Scala Spark-StorageLevel(仅磁盘\u与内存\u和\u磁盘)和内存不足的Java堆空间

Scala Spark-StorageLevel(仅磁盘\u与内存\u和\u磁盘)和内存不足的Java堆空间,scala,apache-spark,caching,memory,rdd,Scala,Apache Spark,Caching,Memory,Rdd,最近,我一直在运行一个记忆繁重的spark作业,并开始怀疑spark的存储级别。我使用StorageLevel.MEMORY\u和\u DISK保存了一个RDD,因为它被使用了两次。我在工作中得到了更多的空间。然后,当我完全删除了persist后,作业成功地完成了 我一直认为内存和磁盘基本上是一个完全安全的选项-如果内存不足,它会将对象溢出到磁盘,完成。但现在看来,它并没有像我预期的那样真正起作用 这引出了两个问题: 如果执行器内存不足时MEMORY\u和\u DISK将对象溢出到磁盘,那么仅使

最近,我一直在运行一个记忆繁重的spark作业,并开始怀疑spark的存储级别。我使用
StorageLevel.MEMORY\u和\u DISK
保存了一个RDD,因为它被使用了两次。我在工作中得到了更多的空间。然后,当我完全删除了persist后,作业成功地完成了

我一直认为
内存和磁盘
基本上是一个完全安全的选项-如果内存不足,它会将对象溢出到磁盘,完成。但现在看来,它并没有像我预期的那样真正起作用

这引出了两个问题:

  • 如果执行器内存不足时
    MEMORY\u和\u DISK
    将对象溢出到磁盘,那么仅使用
    DISK\u
    模式是否有意义(除了一些非常特定的配置,如
    spark.MEMORY.storageFraction=0
  • 如果当executor耗尽内存时,
    内存和磁盘
    将对象溢出到磁盘,我如何通过删除缓存来解决OOM的问题?我是不是错过了什么,而问题其实在别的地方

  • 内存和磁盘
    不会“在执行器内存不足时将对象溢出到磁盘”。 它告诉Spark将内存中不适合的分区写入磁盘,以便在需要时从那里加载

    处理海量数据集时,必须明确地考虑将数据持久化为DISKION。 所以,几年后;)这就是我认为发生的事情:

    • 缓存不是一种节省执行内存的方法。缓存时,最好不要丢失执行内存(
      DISK\u ONLY
    • 很可能是由于缺少执行内存导致我的作业抛出OOM错误,尽管我不记得实际的用例
    • 我使用了
      内存和\u磁盘
      缓存,而
      内存
      部分从统一区域获取了它的一部分,这使得我的作业无法完成(因为
      执行=统一-存储
      内存不足以执行作业)
    • 由于上面的原因,当我完全删除缓存时,速度会变慢,但是作业有足够的执行内存来完成
    • 仅使用
      DISK\u
      缓存,作业似乎也会因此完成(尽管不一定更快)

    1。当您仅将DISK_用于持久化时,是否会遇到同样的问题?2.看不到代码就很难判断。您使用的是重数据结构吗?spark.memory.france定义用于执行和存储的堆的分数。这意味着在缓存时,数据结构的堆更少,所以OOM错误更容易出现。@IslamHassan嗯,我必须承认我没有只尝试磁盘,我已经放弃了,并且根本没有使用持久化。关于这个问题,您希望在代码中看到什么?(尽管我遗漏了一些东西,但我问的是溢出到磁盘的问题)@Miguel在我正在处理的RDD中,我保存在那里的对象可能有点重,但这些在RDD中,所以我相信这些不算你的问题。关于无火花结构,基本上什么都没有。实际上,这取决于你的工作设计。您能举一个您的问题的例子吗?除了更精确地说明内存和磁盘的作用外,这并不能真正回答问题。尽管您认为磁盘只是不浪费内存的唯一缓存方式,这是正确的。我将在另一个答复中详细说明这一点。