我是Apache Spark的新手,我在火花中有几个基本问题,在阅读火花材料时我无法理解。每种材料都有自己的解释风格。我在Ubuntu上使用PySpark Jupyter笔记本来练习。
根据我的理解,当我运行下面的命令时,testfile.csv中的数据被分区并存储在各个节点的内存中。(实际上我知道它是一个懒惰的评估,它只有在看到动作才会处理命令),但仍然是概念
rdd1 = sc.textFile("testfile.csv")
我的问题是当我运行下面的转换和动作命令时,rdd2数据将存储在何处。
1.它存储在内存中吗?
rdd2 = rdd1.map( lambda x: x.split(",") )
rdd2.count()
我知道rdd2中的数据可用,直到我关闭jupyter笔记本。然后需要cache(),无论如何rdd2可以进行所有转换。我听说在完成所有转换后,内存中的数据被清除了,那是什么?
将RDD保留在内存和缓存()
之间是否有任何区别rdd2.cache()
答案 0 :(得分:7)
它存储在内存中吗?
当您通过操作(count
,print
,foreach
)运行spark变换时,那么,只有这样才能实现图表并且在您的情况下,文件正在被使用。 RDD.cache
旨在确保sc.textFile("testfile.csv")
的结果在内存中可用,并且不需要再次读取。
不要将变量与幕后正在进行的实际操作混淆。缓存允许您重新迭代数据,确保它在内存中(如果有足够的内存将其全部存储在其中)如果您想重新迭代所述RDD,并且只要您设置了正确的数据存储级别(默认为StorageLevel.MEMORY
)。 From the documentation(谢谢@RockieYang):
此外,每个持久的RDD可以使用不同的存储 存储级别,例如,允许您持久保存数据集 磁盘,将其保留在内存中,但作为序列化的Java对象(保存 space),跨节点复制它,或者在Tachyon中将它存储在堆外。 通过传递StorageLevel对象(Scala,Java, Python)坚持()。 cache()方法是使用的简写 默认存储级别,即StorageLevel.MEMORY_ONLY(存储 在内存中反序列化的对象。)
您可以使用persist()或cache()标记要保留的RDD 方法就可以了。第一次在动作中计算它,它将是 保留在节点上的内存中。 Spark的缓存是容错的 - 如果有的话 RDD的分区丢失,它将自动重新计算使用 最初创建它的转换。
将RDD保留在内存和缓存()
之间是否有任何区别?
如上所述,只要您提供了正确的存储级别,就可以通过cache
将其保留在内存中。否则,在您想要重新使用它时,它不一定会保留在内存中。