【问题标题】:What happens to previous RDD when the next RDD is materialized?当下一个 RDD 物化时,前一个 RDD 会发生什么?
【发布时间】:2016-05-12 06:13:43
【问题描述】:

在spark中,我想知道下一个RDD具体化时前一个RDD会发生什么。

假设我有以下 scala 代码

val lines = sc.textFile("/user/cloudera/data.txt")
val lineLengths = lines.map(s => s.length)
val totalLength = lineLengths.reduce((a, b) => a + b)

我有linesRDD 是一个基本的RDD 同样我有linesLengths RDD

我知道这两个 RDD 在调用 reduce Action 时会实现。

我的问题是,当数据流经这 2 个 RDD 时,当linesLengthsRDD 被具体化时,linesRDD 会发生什么。

一旦linesLengthsRDD被具体化,那么linesRDD中的数据是否会被删除?

假设在生产 Spark 作业中可能有 100 个 RDD,针对第 100 个 RDD 调用单个 Action。

当第 99 个 RDD 实现时,第一个 RDD 中的数据会发生什么?

所有RDD中的数据都被删除,只有各自的最终Action返回各自的输出?

或者

一旦 RDD 按照 DAG 将其数据传递给下一个 RDD,每个 RDD 中的数据就会自动删除?

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    实际上lines 和lineLength 在reduce 之后都会保留它们的rdds。正如您所提到的,您可以将 rdd 视为转换的 DAG。因此,如果稍后您想对 lines 或 lineLength 执行一些其他转换,您可以。即使它们在减少期间实现,除非您直接缓存它们,否则当在它们所属的 DAG 上调用另一个操作时,它们将再次运行它们的转换。

    【讨论】:

    • 我没有在任何 RDD 上应用任何缓存操作。那么在reduce之后,lines和lineLength都将保留它们的rdds DATA吗?我的问题都是关于 RDD 中的数据
    • 它们将保持与减少之前相同。他们实际上并不持有数据。仅当提交操作并将其分配给某个变量时才会检索数据。
    • 是的。当您调用 Action 时,spark 会从源位置读取数据并进行所有转换。这意味着每个转换的每个 RDD 都会被具体化。我的问题是每个 RDD 是否会保留数据,直到操作返回一些输出,或者每个 RDD 在发送它的数据后立即删除它保留的数据?
    • 数据被转换,如果没有缓存则不保存。所以,我猜你可以说它被“删除”了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 2016-12-23
    相关资源
    最近更新 更多