Apache spark 持久化后两次spark-RDD过程

Apache spark 持久化后两次spark-RDD过程,apache-spark,Apache Spark,我制作了一个RDD,并从origin创建了另一个RDD,如下所示 val RDD2 = RDD1.map({ println("RDD1") .... }).persist(StorageLevel.MEMORY_AND_DISK) RDD2.foreach({ println("RDD2") ... }) ...so on.. RDD1 RDD1 RDD1 RDD1 RDD2 RDD2 RDD2 RDD2 RDD2 RDD1 -- repeat RDD1 process.

我制作了一个RDD,并从origin创建了另一个RDD,如下所示

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

RDD2.foreach({
  println("RDD2")
  ...
})
...so on..
RDD1
RDD1
RDD1
RDD1
RDD2
RDD2
RDD2
RDD2
RDD2
RDD1 -- repeat RDD1 process. WHY? 
RDD1
RDD1
RDD1
RDD2
RDD2
RDD2
RDD2
RDD2
我希望RDD1的进程只执行一次,因为RDD1是通过persist方法保存在内存或磁盘上的

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

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

RDD2.foreach({
  println("RDD2")
  ...
})
...so on..
RDD1
RDD1
RDD1
RDD1
RDD2
RDD2
RDD2
RDD2
RDD2
RDD1 -- repeat RDD1 process. WHY? 
RDD1
RDD1
RDD1
RDD2
RDD2
RDD2
RDD2
RDD2

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

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

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

RDD2.count // Forces the caching 

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

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

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

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

RDD2.count // Forces the caching 

现在,如果您执行任何其他操作,当第一个“RDD1”被全部打印时,RDD2将不会被重新计算,我可以保证RDD1的处理已经完成。它做了两次同样的工作。我猜你最后做了一些
collect
动作?还返回一个RDD。@davidshen84是的,我在RDD1和RDD2的代码末尾收集了一个映射()?记住Spark中的两个主要概念:转化和行动。在您采取行动之前,转换不会对RDD产生任何影响。当第一个“RDD1”全部打印出来时,我可以保证RDD1的过程已经完成。它做了两次同样的工作。我猜你最后做了一些
collect
动作?还返回一个RDD。@davidshen84是的,我在RDD1和RDD2的代码末尾收集了一个映射()?记住Spark中的两个主要概念:转化和行动。在您采取行动之前,转换不会对RDD产生任何影响。是否有任何配置选项可用于强制缓存?i、 e.不调用动作方法no,这是spark的设计。您必须通过调用Rddfrom Spark RDD文档网页上的操作来强制缓存:“默认情况下,每次对每个转换的RDD运行操作时,都可以重新计算它。但是,您也可以使用持久化(或缓存)将RDD持久化到内存中方法,在这种情况下,Spark将保留集群上的元素,以便下次查询时更快地访问“这有点混乱,因此网页上说persist使RDD被缓存以备将来使用,而您认为它是一种惰性操作。它会在缓存中保留,但不会立即使用。它仅在对此调用操作后才会持续。参考请看这本书。这明确提到spark缓存是惰性操作。是否有任何配置选项可用于强制缓存?i、 e.不调用动作方法no,这是spark的设计。您必须通过调用Rddfrom Spark RDD文档网页上的操作来强制缓存:“默认情况下,每次对每个转换的RDD运行操作时,都可以重新计算它。但是,您也可以使用持久化(或缓存)将RDD持久化到内存中方法,在这种情况下,Spark将保留集群上的元素,以便下次查询时更快地访问“这有点混乱,因此网页上说persist使RDD被缓存以备将来使用,而您认为它是一种惰性操作。它会在缓存中保留,但不会立即使用。它仅在对此调用操作后才会持续。参考请看这本书。这明确提到spark缓存是延迟操作。