scala - Spark清理shuffle溢出到磁盘

标签 scala apache-spark out-of-memory spark-streaming

我有一个循环操作,它生成一些 RDD,进行重新分区,然后进行聚合键操作。循环运行一次后,会计算出最终的 RDD,该 RDD 会被缓存和检查点,并用作下一次循环的初始 RDD。

这些 RDD 非常大,并且在每次迭代到达最终 RDD 之前都会生成大量中间 shuffle block 。我正在压缩我的随机播放并允许随机播放到磁盘。

我注意到在我的工作机器上,存储随机文件的工作目录没有被清理。因此最终我用完了磁盘空间。我的印象是,如果我检查 RDD,它将删除所有中间的 shuffle block 。然而这似乎并没有发生。有人知道如何在每次循环迭代后清理我的随机播放 block ,或者为什么我的随机播放 block 没有被清理吗?

最佳答案

将 RDD 缓存到内存/磁盘后,只要 Spark 上下文处于事件状态,RDD 就会存储在您的内存/磁盘中。

为了告诉驱动程序它可以从内存/磁盘中删除 RDD,您需要使用 unpersist() 函数。

From the java-doc:

 /**
   * Mark the RDD as non-persistent, and remove all blocks for it from memory and disk.
   *
   * @param blocking Whether to block until all blocks are deleted.
   * @return This RDD.
   */
  def unpersist(blocking: Boolean = true)

所以你可以使用:

rdd.unpersist()

关于scala - Spark清理shuffle溢出到磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34788507/

相关文章:

android - 如何使用 Cursor.getString() 修复 OutOfMemory?

scala - Spark SQL 过滤多个字段

xml - 当空值出现时 Spark XML 标签丢失

java - Bitmap.createBitmap 内存不足错误 java

scala - 为什么将偏函数应用于以 2 种不同方式定义的执行相同操作的 2 个函数会返回不同的结果?

java - Spark 和 Google Cloud Firestore 与 SBT 的依赖性问题

android - OutOfMemory 在设备和模拟器上

java - 地道的 Scala 列表理解 - 第一项匹配

scala - 在可遍历 View 上执行 foldLeft 时在 Scala 中输入方差错误

scala - 使用 Intellij Idea 在 Scala 中生成返回类型签名