SPARK:在另一个RDD完全在内存中之后,将一个大的RDD取消

时间:2015-12-06 05:21:00

标签: memory apache-spark persist

我希望在另一个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将无人值守?

谢谢!

2 个答案:

答案 0 :(得分:0)

在您的情况下,对RDD2进行计数是非常昂贵的操作。您无法直接检查RDD2是否在主内存中完全加载。你必须先在RDD2上运行一个动作(如你所做的那样),然后Spark将持久保存RDD2以进行后续迭代。但是,上述方法并不完全有效,因为您必须对RDD2执行整个扫描,如果RDD1和RDD2一起接近超过可用内存,那么执行时间会慢得多。

检查RDD2大小是否大于0的两个备选建议是:

  1. 检查RDD是否为空(!RDD.isEmpty)
  2. 检查是否存在至少一个元素(!RDD.take(1)== 0或!RDD.first()== 0)

答案 1 :(得分:0)

您是否专门缓存RDD1以加快MyProcessor.process(RDD1)的速度?在缓存之后和调用MyProcessor.process(RDD1)之前,您是否对RDD1执行任何转换和操作?这些是您可能需要重新访问的内容,因为cache是懒惰的,所以如果在MyProcessor.process(RDD1)中您只对RDD1执行了一次操作,那么unpersist之后我就不会认为你正在充分利用缓存。