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

问题描述 投票:4回答:1

我是Apache Spark的新手,我在火花中有几个基本问​​题,在阅读火花材料时我无法理解。每种材料都有自己的解释风格。我在Ubuntu上使用PySpark Jupyter笔记本来练习。

根据我的理解,当我运行下面的命令时,testfile.csv中的数据被分区并存储在各个节点的内存中。(实际上我知道它是一个懒惰的评估,它只有在看到动作命令才会处理),但仍然是这个概念

rdd1 = sc.textFile("testfile.csv")

我的问题是当我运行下面的转换和动作命令时,rdd2数据将存储在何处。

它存储在内存中吗?

rdd2 = rdd1.map( lambda x: x.split(",") )

rdd2.count()

我知道rdd2中的数据可用,直到我关闭jupyter笔记本。然后需要cache(),无论如何rdd2可以进行所有转换。我听说在完成所有转换后,内存中的数据被清除了,那是什么意思?

  1. 将RDD保留在内存和缓存()之间是否有任何区别 rdd2.cache()
caching apache-spark pyspark rdd
1个回答
7
投票

它存储在内存中吗?

当你通过一个动作(countprintforeach)运行一个spark变换时,那么,只有这样你的图形才会被实现,在你的情况下,文件正被消耗。 RDD.cache的目的是确保sc.textFile("testfile.csv")的结果在内存中可用,并且不需要再次读取。

不要将变量与幕后执行的实际操作混淆。缓存允许您重新迭代数据,确保它在内存中(如果有足够的内存将其全部存储在其中)如果您想重新迭代所述RDD,并且只要您设置了正确的数据存储级别(默认为StorageLevel.MEMORY)。 From the documentation(谢谢@RockieYang):

此外,每个持久化RDD可以使用不同的存储级别进行存储,例如,允许您将数据集保留在磁盘上,将其保留在内存中,但作为序列化Java对象(以节省空间),跨节点复制或存储它在Tachyon的堆外。通过将StorageLevel对象(Scala,Java,Python)传递给persist()来设置这些级别。 cache()方法是使用默认存储级别的简写,即StorageLevel.MEMORY_ONLY(在内存中存储反序列化的对象)。

您可以使用persist()或cache()方法标记要保留的RDD。第一次在动作中计算它,它将保留在节点的内存中。 Spark的缓存是容错的 - 如果丢失了RDD的任何分区,它将使用最初创建它的转换自动重新计算。


将RDD保留在内存和缓存()之间是否有任何区别

如上所述,只要您提供了正确的存储级别,就可以通过cache将其保存在内存中。否则,在您想要重新使用它时,它不一定会保留在内存中。

© www.soinside.com 2019 - 2024. All rights reserved.