我用平面图做了一个rdd。稍后我将对其执行范围分区。如果我坚持原来的rdd,一切正常。但是,如果我不缓存它,range partitioner部分会以某种方式重新计算原始rdd的部分。如果我没有足够的内存,我可以理解,但是在这种情况下,我的系统中的内存比rdd占用的内存多得多。其次,rdd的计算时间很长,因此重新启动/重新计算会严重影响性能。这种奇怪行为的原因是什么?
p、 我只用rdd一次。所以,这不应该发生。
我用平面图做了一个rdd。稍后我将对其执行范围分区。如果我坚持原来的rdd,一切正常。但是,如果我不缓存它,range partitioner部分会以某种方式重新计算原始rdd的部分。如果我没有足够的内存,我可以理解,但是在这种情况下,我的系统中的内存比rdd占用的内存多得多。其次,rdd的计算时间很长,因此重新启动/重新计算会严重影响性能。这种奇怪行为的原因是什么?
p、 我只用rdd一次。所以,这不应该发生。
2条答案
按热度按时间5us2dqdw1#
spark就是这样工作的:
当您持久化rdd时,每个节点将其计算的任何分区存储在内存中,并在该数据集(或从该数据集派生的数据集)上的其他操作中重用这些分区。
所以当你不这样做的时候,它就不会。如果您不止一次地使用rdd,并且有足够的内存,那么您通常希望将其持久化。
这不能自动完成,因为spark不知道您是否要重用rdd:例如,您可以计算rdd,然后
sample
它,并使用结果来决定是否要对rdd执行其他操作,因此rdd是否使用两次取决于随机数生成器。6uxekuva2#
如果您没有使用rdd.cache,rdd计算结果将不会持久保存在内存中
现在,
a
以及b
这三个rdd数据不在内存中。那么,什么时候val c = b.map(_+1)
,a
以及b
将重新计算。如果我们在a和b上使用缓存:那么
val c = b.map(_+1)
,a
以及b
不会重新计算。(请注意:如果内存不足,
cache
方法会失败,所以a
以及b
将重新计算。对不起,我英语不好。