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

时间:2016-07-26 05:41:29

标签: caching apache-spark pyspark rdd

我是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可以进行所有转换。我听说在完成所有转换后,内存中的数据被清除了,那是什么?

  1. 将RDD保留在内存和缓存()

    之间是否有任何区别

    rdd2.cache()

1 个答案:

答案 0 :(得分:7)

  

它存储在内存中吗?

当您通过操作countprintforeach)运行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 将其保留在内存中。否则,在您想要重新使用它时,它不一定会保留在内存中。