【问题标题】:What happens if I cache the same RDD twice in Spark如果我在 Spark 中缓存相同的 RDD 两次会发生什么
【发布时间】:2016-07-11 17:50:43
【问题描述】:

我正在构建一个通用函数,它接收 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);
}

我的问题是,因为r 是给我的,所以它可能已经被缓存了,也可能没有被缓存。如果它被缓存并且我再次对其调用缓存,spark 会创建一个新的缓存层,这意味着在计算t1t2 时,我将在缓存中有两个r 实例?还是 spark 知道 r 被缓存并忽略它?

【问题讨论】:

    标签: java caching apache-spark rdd


    【解决方案1】:

    什么都没有。如果您在缓存的 RDD 上调用 cache,则不会发生任何事情,RDD 将被缓存(一次)。与许多其他转换一样,缓存是惰性的:

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

    所以你是安全的。

    【讨论】:

    • 关于你的笔记,我想了一会儿,没有找到任何记录。如果你的答案是正确的并且调用缓存只改变了RDD对象中的一个标志,为什么我不能使用同一个对象?
    • 我会在便条上稍微解释一下我的问题。如果有名为orig 的RDD 并且函数外部的人做了r = orig.cache();,那么我在函数调用cached = r.cache(); 中。如果你说的是真的,我最终会在缓存中存储两次相同的数据,一次是r,一次是cached,不是吗?
    • 你是对的 - 我错了。无需使用cache 返回值,它返回this - 完全相同的RDD。
    • 比方说,我有 - ` rdd1= SC.wholetextfile(......); rdd1.cache(); rdd1=rdd1.map(.....); rdd1.cache(); rdd1.count();。 ` 它会只缓存一次还是会覆盖以前的缓存,因为在同一个 rdd 上发生了一些转换?
    【解决方案2】:

    在我的集群上测试一下,Zohar 是对的,没有任何反应,它只会缓存 RDD 一次。我认为原因是每个RDD内部都有一个id,spark会使用id来标记RDD是否已被缓存。所以多次缓存一个RDD不会有任何作用。

    下面是我的代码和截图:

    更新[根据需要添加代码]


    ### cache and count, then will show the storage info on WEB UI
    
    raw_file = sc.wholeTextFiles('hdfs://10.21.208.21:8020/user/mercury/names', minPartitions=40)\
                     .setName("raw_file")\
                     .cache()
    raw_file.count()
    
    ### try to cache and count again, then take a look at the WEB UI, nothing changes
    
    raw_file.cache()
    raw_file.count()
    
    ### try to change rdd's name and cache and count again, to see will it cache a new rdd as the new name again, still 
    ### nothing changes, so I think maybe it is using the RDD id as a mark, for more we need to take a detailed read on 
    ### the document even then source code
    
    raw_file.setName("raw_file_2")
    raw_file.cache().count()
    

    【讨论】:

    • 谢谢,您是否知道@TzachZohar 关于 cache() 的说法是否属实。如果是这样,你不需要写raw_file = raw_file.cache()吗?
    • @RoeeGavirel缓存只是RDD的一个方法,它什么都不返回,这里是文档:spark.apache.org/docs/latest/api/python/…
    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 2016-11-29
    • 1970-01-01
    • 2019-07-08
    相关资源
    最近更新 更多