为什么在Spark中懒惰地评估persist()

Din*_*108 11 scala apache-spark

我理解Scala中有两种类型的操作

  1. 转换
  2. 操作

像map(),filter()这样的转换是懒惰的.因此,可以在Action执行上完成该优化.例如,如果我执行action first(),那么Spark将优化为只读取第一行.

但是为什么persist()操作会被懒惰地评估.因为无论我采取哪种方式,热切地或懒惰地,它都将按照存储级别保持整个RDD.

能否详细说明为什么persist()是转型而不是行动.

zer*_*323 11

对于初学者来说,渴望持久会污染整个管道.cachepersist只表达意图.这并不意味着我们将在RDD实现并且可以实际缓存时达到目的.此外,存在自动缓存数据的上下文.

因为无论我采取哪种方式,热切地或懒惰地,它都将按照存储级别保持整个RDD.

这不完全正确.事情是,persist不是持久的.因为它明确规定了文档中MEMORY_ONLY持续等级:

如果RDD不适合内存,则某些分区将不会被缓存,并且每次需要时都会重新计算.

随着MEMORY_AND_DISK剩余的数据存储到磁盘上,而仍然被驱逐,如果没有足够的内存用于后续缓存.更重要的是:

Spark会自动监视每个节点上的缓存使用情况,并以最近最少使用(LRU)的方式删除旧数据分区.

您还可以认为cache/ persist在语义上与为特定IO副作用执行的Spark操作不同.cache更多的是我们可能希望稍后重用这段代码的Spark引擎的提示.


Rüd*_*ehn 6

如果你有一些你可能会或可能不会使用的数据,那么persist()急于求成就会效率低下.普通的Spark转换对应def于Scala中的a.坚持把它变成了一个lazy val.