gpt4 book ai didi

apache-spark - 理解 Spark 的缓存

转载 作者:行者123 更新时间:2023-12-03 07:51:27 25 4
gpt4 key购买 nike

我试图了解 Spark 的缓存是如何工作的。

这是我幼稚的理解,如果我遗漏了什么,请告诉我:

val rdd1 = sc.textFile("some data")
rdd1.cache() //marks rdd1 as cached
val rdd2 = rdd1.filter(...)
val rdd3 = rdd1.map(...)
rdd2.saveAsTextFile("...")
rdd3.saveAsTextFile("...")

在上面,rdd1 只会从磁盘(例如 HDFS)加载一次。 (当 rdd2 被保存时,我假设)然后从缓存中(假设有足够的 RAM)当 rdd3 被保存时)

现在这是我的问题。假设我想缓存 rdd2 和 rdd3,因为它们都将在以后使用,但在创建它们后我不需要 rdd1。

基本上有重复,不是吗?既然计算了 rdd2 和 rdd3 ,我就不再需要 rdd1 了,我应该不坚持了吧?问题是什么时候?

这会起作用吗? (选项 A)
val rdd1 = sc.textFile("some data")
rdd1.cache() // marks rdd as cached
val rdd2 = rdd1.filter(...)
val rdd3 = rdd1.map(...)
rdd2.cache()
rdd3.cache()
rdd1.unpersist()

spark 是否将非持久调用添加到 DAG?还是立即完成?如果立即完成,那么当我从 rdd2 和 rdd3 读取时,基本上 rdd1 将不会被缓存,对吗?

我应该这样做吗(选项 B)?
val rdd1 = sc.textFile("some data")
rdd1.cache() // marks rdd as cached
val rdd2 = rdd1.filter(...)
val rdd3 = rdd1.map(...)

rdd2.cache()
rdd3.cache()

rdd2.saveAsTextFile("...")
rdd3.saveAsTextFile("...")

rdd1.unpersist()

所以问题是这样的:
选项 A 是否足够好?即会 rdd1仍然只加载一次文件?
或者我需要选择 B 吗?

最佳答案

似乎需要选项B。原因与Spark如何执行persist/cache和unpersist有关。由于 RDD 转换仅构建 DAG 描述而不执行,因此在选项 A 中,当您调用 unpersist 时,您仍然只有作业描述而不是正在运行的执行。

这是相关的,因为 cachepersist call 只是将 RDD 添加到 RDD 的 Map 中,这些 RDD 将自己标记为在作业执行期间持久化。然而,unpersist直接告诉 blockManager 从存储中驱逐 RDD 并删除持久 RDD 映射中的引用。

persist function

unpersist function

因此,您需要在 Spark 实际执行并使用块管理器存储 RDD 之后调用 unpersist。
RDD.persist的评论方法提示:
rdd.persist

关于apache-spark - 理解 Spark 的缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29903675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com