我使用flatMap制作RDD。稍后我会对它进行范围分区。如果我坚持原始RDD,一切正常。但是,如果我没有缓存它,范围分区器部分想要重新计算原始RDD的一部分。我知道如果我没有足够的内存,但在这种情况下,我的系统中的内存比RDD占用的内存多得多。其次,该RDD的计算很长,因此重新启动/重新计算确实会损害性能。这种奇怪行为可能是什么原因?
P.S我只使用RDD一次。所以,这不应该发生。
答案 0 :(得分:7)
这就是Spark的工作原理:
所以当你不这样做时,事实并非如此。如果您多次使用RDD并且有足够的内存,通常需要保留它。
这不能自动完成,因为Spark无法知道您是否要重复使用RDD:例如你可以计算一个RDD,然后sample
,并使用结果来决定你是否想用RDD做其他事情,所以RDD是否被使用两次取决于随机数生成器。
答案 1 :(得分:3)
如果您没有使用RDD.cache,RDD计算结果将不会在内存中持久存在。例如(有一个rdd数据rdd_test)
val rdd_test: RDD[Int] = sc.makeRDD(Array(1,2,3), 1)
val a = rdd_test.map(_+1)
val b = a.map(_+1)
现在,a
和b
这三个rdd数据不在内存中。因此,当val c = b.map(_+1)
,a
和{{1将被重新计算。
如果我们在a和b上使用缓存:
b
然后val rdd_test: RDD[Int] = sc.makeRDD(Array(1,2,3), 1)
val a = rdd_test.map(_+1).cache
val b = a.map(_+1).cache
,val c = b.map(_+1)
和a
将不会重新计算。
(请注意:如果内存不足,b
方法将失败,因此cache
和a
将重新计算。
我不擅长英语,对不起。