Apache spark Spark RDD缓存将走多远?

Apache spark Spark RDD缓存将走多远?,apache-spark,distributed-computing,Apache Spark,Distributed Computing,假设我在rdd1上调用了三个RDD转换函数: 现在我想缓存rdd4,所以我调用rdd4.cache() 我的问题: 是否只缓存对rdd4执行的操作的结果,还是缓存rdd4上面的每个RDD?假设我想同时缓存rdd3和rdd4,我需要分别缓存它们吗?缓存的整个思想是spark不会将结果保存在内存中,除非您告诉它。因此,如果缓存链中的最后一个RDD,它只会将该RDD的结果保存在内存中。因此,是的,您确实需要单独缓存它们,但请记住,如果要多次使用RDD,您只需要缓存它,例如: rdd4.cache()

假设我在rdd1上调用了三个RDD转换函数:

现在我想缓存
rdd4
,所以我调用
rdd4.cache()

我的问题:


是否只缓存对
rdd4
执行的操作的结果,还是缓存
rdd4
上面的每个RDD?假设我想同时缓存
rdd3
rdd4
,我需要分别缓存它们吗?

缓存的整个思想是spark不会将结果保存在内存中,除非您告诉它。因此,如果缓存链中的最后一个RDD,它只会将该RDD的结果保存在内存中。因此,是的,您确实需要单独缓存它们,但请记住,如果要多次使用RDD,您只需要缓存它,例如:

rdd4.cache()
val v1 = rdd4.lookup("key1")
val v2 = rdd4.lookup("key2")

如果在这种情况下不调用cache,则每次调用lookup(或任何其他需要求值的函数)都会重新计算rdd4。您可能想阅读“这很容易理解”,并解释他们就RDD的工作方式所做的某些选择背后的想法。

感谢您的回答。因此,无论何时出现分支,都需要缓存该rdd以减少重复计算。唯一的痛苦是取消缓存rdd上的持久化(因为我的rdd转换中有多个fork)。我会再看一遍报纸。Thanks@EdwinGuo请不要引用我的话,但我认为大多数人发现花额外的时间取消持久化通常比它的价值更麻烦,最好让JVM处理这个问题,因为不抵抗是一个非常昂贵的操作OK,我是否应该就此提出另一个问题?试图搜索非持久性,没有运气。“将RDD标记为非持久性,并从内存和磁盘中删除它的所有块。”much@EdwinGuo如果需要,我会在询问之前搜索另一种缓存方法,我听说spark的最新版本可能支持使用用户定义的优先级(如FIFO)自动取消持久化
rdd4.cache()
val v1 = rdd4.lookup("key1")
val v2 = rdd4.lookup("key2")