首页 > 解决方案 > spark - 持久化后两次 RDD 进程

问题描述

我制作了一个 RDD 并从下面的原点创建了另一个 RDD。

val RDD2 = RDD1.map({
  println("RDD1")
  ....
}).persist(StorageLevel.MEMORY_AND_DISK)

RDD2.foreach({
  println("RDD2")
  ...
})
...so on..

我预计 RDD1 的进程只会执行一次,因为 RDD1 通过持久方法保存在内存或磁盘上。

但不知何故,“RDD1”在“RDD2”之后打印,如下所示。

RDD1
RDD1
RDD1
RDD1
RDD2
RDD2
RDD2
RDD2
RDD2
RDD1 -- repeat RDD1 process. WHY? 
RDD1
RDD1
RDD1
RDD2
RDD2
RDD2
RDD2
RDD2

标签: apache-spark

解决方案


这是 spark 的预期行为。像大多数spark中坚持的操作也是懒惰的操作。因此,即使您为第一个 RDD 添加持久化,spark 也不会缓存数据,除非您在持久化操作之后添加任何操作。map 操作在 spark 中不是一个动作,它也是惰性的。

强制缓存的方法是count在持久化之后添加操作RDD2

val RDD2 = RDD1.map({
   println("RDD1")
   ....
}).persist(StorageLevel.MEMORY_AND_DISK)

RDD2.count // Forces the caching 

现在,如果您执行任何其他操作,将不会重新计算 RDD2


推荐阅读