Wan*_*rer 5 caching apache-spark rdd pyspark
我是Apache Spark的新手,我在Spark中有几个基本问题,在阅读Spark资料时无法理解。每种材料都有自己的解释风格。我在Ubuntu上使用PySpark Jupyter笔记本进行练习。
根据我的理解,当我运行以下命令时,testfile.csv中的数据将被分区并存储在各个节点的内存中(实际上我知道这是一个懒惰的评估,只有在看到action命令后才会处理),但仍然是
rdd1 = sc.textFile("testfile.csv")
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我运行下面的transformation and action命令时,rdd2数据将存储在哪里。
1.是否存储在内存中?
rdd2 = rdd1.map( lambda x: x.split(",") )
rdd2.count()
Run Code Online (Sandbox Code Playgroud)
我知道rdd2中的数据将一直可用,直到我关闭jupyter笔记本为止。然后需要cache(),无论如何rdd2都可以进行所有转换。听说所有转换后的内存中的数据都被清除了,这是怎么回事?
将RDD保留在内存和cache()之间有什么区别
rdd2.cache()
它存储在内存中吗?
当您通过运行一个火花变换动作(count,print,foreach),那么,也只有这样你图的存在物化并在你的情况下,文件被消耗。RDD.cache目的在于确保的结果sc.textFile("testfile.csv")在内存中可用,并且不需要再次读取。
不要将变量与在幕后进行的实际操作混淆。缓存使您可以重新迭代数据,并确保它在内存中(如果有足够的内存将其完整存储),如果您想重新迭代该RDD,并且设置正确,存储级别(默认为StorageLevel.MEMORY)。从文档中(感谢@RockieYang):
此外,每个持久化的RDD可以使用不同的存储级别进行存储,例如,允许您将数据集持久化在磁盘上,持久化在内存中,但是作为序列化的Java对象(以节省空间),跨节点复制或存储它在Tachyon堆外。通过将StorageLevel对象(Scala,Java,Python)传递给persist()来设置这些级别。cache()方法是使用默认存储级别StorageLevel.MEMORY_ONLY(将反序列化的对象存储在内存中)的简写。
您可以使用其上的persist()或cache()方法将一个RDD标记为持久。第一次在操作中对其进行计算时,它将被保存在节点上的内存中。Spark的缓存是容错的–如果RDD的任何分区丢失,它将使用最初创建它的转换自动重新计算。
将RDD保留在内存和cache()之间有什么区别
如上所述,只要您提供了正确的存储级别,就可以通过将其保留在内存中cache。否则,在您要重用它时,它不一定会保留在内存中。
| 归档时间: |
|
| 查看次数: |
3109 次 |
| 最近记录: |