【问题标题】:How loading RDD works in Spark在 Spark 中加载 RDD 是如何工作的
【发布时间】:2015-07-31 18:25:17
【问题描述】:

我是 Spark 的新手,对 RDD 有疑问。假设我定义一个 RDD 如下:

val data1 = sc.textFile()

然后假设我执行以下操作

1) val data2 = data1.map{...}
2) val data3 = data1

我很想知道 1 和 2 的幕后发生了什么。data1,data2data3 在内存中是完全不同的吗?也就是说,它们每个都占用一些内存还是存在某种程度的数据共享?比如data1data3只有一块内存?

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    RDD's 只是要完成的工作的表示,称为血统。而且,这是“不可变的”*,这导致我进入第一个场景。 data1 是加载文件的指令。当您使用它的 map 方法时,它会将该指令与新指令组合在一起,以便它返回一个新指令集 load file then transform it。所以,它是一个包含第一个指令集的新指令集。在第二种情况下,您最终会得到两个指向相同指令的内存位置。

    所以,实际上,所有这些场景都有相同的指令集。您可以在以下代码中看到:

    val init = sc.parallelize(1 to 10).map(x=>{println(x);x})
    val mapped = init.map(_+1)
    val initCopy = init
    initCopy.cache
    initCopy.collect //Notice that the println occurs...this also caches the end result
    mapped.collect //Notice that the println does NOT occur since it was using the same instruction that was cached
    

    *我在引号中这么说是因为它的某些部分可以修改,例如当您调用 cache 时,但血统是不可变的。

    【讨论】:

    • 所以对于第二条指令 (val data3=data1),当我对 data1 运行操作时,它会将数据带入内存并在其上执行指令。然后如果我对data3执行不同的操作,它会再次将数据带入内存并执行新指令?那正确吗?如果这是正确的,我有什么 .cache() 来自 data1?
    • 没错,它会不断加载(授予并行化记忆第一次调用时的数据......但大多数其他负载一直都是)如果你缓存了 data1 并调用 data3.collect,你'将从缓存中提取。
    猜你喜欢
    • 2015-02-11
    • 1970-01-01
    • 2015-12-07
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2016-01-13
    • 2018-06-08
    相关资源
    最近更新 更多