我希望在另一个RDD(RDD2)完全在内存中之后解除RDD(RDD1)。我有以下代码:
val RDD2 = MyProcessor.process(RDD1).persist(StorageLevel.MEMORY_ONLY_SER_2).
setName("RDD2")
if (RDD2.count > 0) {
RDD1.unpersist()
}
然而,对于大数据集,RDD2.count变得非常慢。有没有更好的方法可以确保在RDD2完全进入内存后RDD1将无人值守?
谢谢!
答案 0 :(得分:0)
在您的情况下,对RDD2进行计数是非常昂贵的操作。您无法直接检查RDD2是否在主内存中完全加载。你必须先在RDD2上运行一个动作(如你所做的那样),然后Spark将持久保存RDD2以进行后续迭代。但是,上述方法并不完全有效,因为您必须对RDD2执行整个扫描,如果RDD1和RDD2一起接近超过可用内存,那么执行时间会慢得多。
检查RDD2大小是否大于0的两个备选建议是:
答案 1 :(得分:0)
您是否专门缓存RDD1以加快MyProcessor.process(RDD1)
的速度?在缓存之后和调用MyProcessor.process(RDD1)
之前,您是否对RDD1执行任何转换和操作?这些是您可能需要重新访问的内容,因为cache
是懒惰的,所以如果在MyProcessor.process(RDD1)
中您只对RDD1执行了一次操作,那么unpersist
之后我就不会认为你正在充分利用缓存。