【发布时间】:2015-04-27 18:48:38
【问题描述】:
我试图了解 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 时),然后在保存 rdd3 时从缓存(假设有足够的 RAM)中)
现在这是我的问题。假设我想缓存 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 是否将 unpersist 调用添加到 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?
【问题讨论】:
标签: apache-spark