当从文本文件或集合(或从另一个RDD)创建弹性分布式数据集(RDD)时,我们是否需要显式调用"cache"或"persist"来将RDD数据存储到内存中?或者默认情况下RDD数据是以分布式方式存储在内存中的吗?
val textFile = sc.textFile("/user/emp.txt")
Run Code Online (Sandbox Code Playgroud)
根据我的理解,在上面的步骤之后,textFile是一个RDD,并且可以在节点的所有/部分内存中使用.
如果是这样,为什么我们需要在textFile RDD上调用"cache"或"persist"呢?
我试图理解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("...")
Run Code Online (Sandbox Code Playgroud)
在上面,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()
Run Code Online (Sandbox Code Playgroud)
火花是否会给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()
Run Code Online (Sandbox Code Playgroud)
所以问题是:
选项A是否足够好?ie rdd1仍然只加载一次文件?或者我需要选择B吗?