为什么spark一直在重新计算rdd?

biswetbf  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(578)

我用平面图做了一个rdd。稍后我将对其执行范围分区。如果我坚持原来的rdd,一切正常。但是,如果我不缓存它,range partitioner部分会以某种方式重新计算原始rdd的部分。如果我没有足够的内存,我可以理解,但是在这种情况下,我的系统中的内存比rdd占用的内存多得多。其次,rdd的计算时间很长,因此重新启动/重新计算会严重影响性能。这种奇怪行为的原因是什么?
p、 我只用rdd一次。所以,这不应该发生。

5us2dqdw

5us2dqdw1#

spark就是这样工作的:
当您持久化rdd时,每个节点将其计算的任何分区存储在内存中,并在该数据集(或从该数据集派生的数据集)上的其他操作中重用这些分区。
所以当你不这样做的时候,它就不会。如果您不止一次地使用rdd,并且有足够的内存,那么您通常希望将其持久化。
这不能自动完成,因为spark不知道您是否要重用rdd:例如,您可以计算rdd,然后 sample 它,并使用结果来决定是否要对rdd执行其他操作,因此rdd是否使用两次取决于随机数生成器。

6uxekuva

6uxekuva2#

如果您没有使用rdd.cache,rdd计算结果将不会持久保存在内存中

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 以及 b 将重新计算。如果我们在a和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 以及 b 将重新计算。
对不起,我英语不好。

相关问题