为什么火花继续重新计算RDD?

时间:2016-10-25 20:10:53

标签: scala apache-spark

我使用flatMap制作RDD。稍后我会对它进行范围分区。如果我坚持原始RDD,一切正常。但是,如果我没有缓存它,范围分区器部分想要重新计算原始RDD的一部分。我知道如果我没有足够的内存,但在这种情况下,我的系统中的内存比RDD占用的内存多得多。其次,该RDD的计算很长,因此重新启动/重新计算确实会损害性能。这种奇怪行为可能是什么原因?

P.S我只使用RDD一次。所以,这不应该发生。

2 个答案:

答案 0 :(得分:7)

这就是Spark的工作原理:

  

When you persist an RDD, each node stores any partitions of it that it computes in memory and reuses them in other actions on that dataset (or datasets derived from it).

所以当你不这样做时,事实并非如此。如果您多次使用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)

现在,ab这三个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方法将失败,因此cachea将重新计算。

我不擅长英语,对不起。