如果我在Spark中缓存两次相同的RDD会发生什么

Roe*_*rel 6 java caching apache-spark rdd

我正在构建一个通用函数,它接收RDD并对其进行一些计算.由于我在输入RDD上运行了多个计算,我想缓存它.例如:

public JavaRDD<String> foo(JavaRDD<String> r) {
    r.cache();
    JavaRDD t1 = r... //Some calculations
    JavaRDD t2 = r... //Other calculations
    return t1.union(t2);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,既然r是给了我它可能已经或可能没有被缓存.如果缓存,我再次呼吁缓存它,会引发创建缓存意味着,虽然新的一层t1t2计算,我将有两个实例r在缓存中?或者火花会意识到r缓存的事实会忽略它吗?

Tza*_*har 13

没什么.如果你调用cache缓存的RDD,没有任何反应,RDD将被缓存(一次).像许多其他转换一样,缓存是懒惰的:

  • 当你打电话时cache,RDD storageLevel设置为MEMORY_ONLY
  • 当你cache再次打电话时,它被设置为相同的值(没有变化)
  • 在评估时,当底层RDD实现时,Spark将检查RDD storageLevel,如果它需要缓存,它将缓存它.

所以你很安全.