在Apache Spark中缓存RDD的目的是什么?

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都可以进行所有转换。听说所有转换后的内存中的数据都被清除了,这是怎么回事?

  1. 将RDD保留在内存和cache()之间有什么区别

    rdd2.cache()

Yuv*_*kov 7

它存储在内存中吗?

当您通过运行一个火花变换动作countprintforeach),那么,也只有这样你图的存在物化并在你的情况下,文件被消耗。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。否则,在您要重用它时,它不一定会保留在内存中。