缓存的重要性[Spark]

时间:2018-03-22 19:53:37

标签: scala apache-spark caching

你能解释一下,为什么会发生以下情况?

我有一个.csv文件包含一些数据(大约25kk行)。 我正在做以下事情:

val RDD1 = sc.textFile(...).map(...).aggregateByKey(...).
           mapValues(...).persist(StorageLevel.MEMORY_AND_DISK)

然后我正在使用RDD1进行更多转换:

val RDD2 = RDD1.zipWithIndex(...).cartesian(...).filter(...).map(...)

此时RDD2中有大约14kk元素,对于每个元素我都在进行一些计算。 最后我将结果写入文件:

RDD2.map(...).saveAsTextFile(...)

似乎工作正常。但是,如果我不使用persist()方法,那么我会得到一些不同的错误,如GC错误,心跳超时错误等。 我认为只有当我多次使用RDD1时,缓存才是必不可少的,所以我不必第二次评估它。但我只使用RDD1一次 - 创建RDD2。为什么会这样?

提前谢谢!

PS:我正在附上my code,如果我上面描述的内容不足以发现问题。

1 个答案:

答案 0 :(得分:0)

I thought that caching is essential only if I use the RDD1 many times, so I don't have to evaluate it for the second time

It is recommended to use persist or cache anytime we want to reuse an RDD (no matter how many times).

In the example used on your question:

val RDD2 = RDD1.zipWithIndex(...).cartesian(...).filter(...).map(...)

when transformations are called on RDD1, RDD1 is reevaluated.

From the docs:

Spark also automatically persists some intermediate data in shuffle operations (e.g. reduceByKey), even without users calling persist. This is done to avoid recomputing the entire input if a node fails during the shuffle. We still recommend users call persist on the resulting RDD if they plan to reuse it.