2016-07-26 48 views
3

我是Apache Spark的新手,我在阅读火花材料时无法理解火花中的几个基本问​​题。每种材料都有自己的解释方式。我在Ubuntu上使用PySpark Jupyter笔记本进行练习。在Apache Spark中缓存RDD的目的是什么?

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

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

我的问题是,当我运行下面的变革和行动命令,其中是否RDD2数据将存储。

1.它存储在内存中吗?

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

rdd2.count() 

我知道RDD2的数据将可用,直到我关闭jupyter notebook.Then什么是高速缓存的需要(),总之RDD2可以做所有的改造。我听说所有的转换后,内存中的数据都被清除了,那是什么意思?

  • 是否有它存储在存储器保持RDD在存储器和高速缓存()

    rdd2.cache()

  • 回答

    4

    是否之间的任何差异?

    当您运行通过动作countprintforeach)火花转型,那么,只有到那时你正在图形化和你的情况的文件被消耗。 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()或缓存() 方法将RDD标记为持久化。第一次在动作中计算时,将在节点上的内存中保存 。Spark的缓存是容错的 - 如果RDD的任何分区丢失,它将自动使用最初创建它的转换重新计算。


    有保持RDD在内存和缓存()

    之间的任何差别如上所述,你通过cache保持在内存中,只要你已经提供了正确的存储级别。否则,在您想要重新使用它时,它不一定会保存在内存中。

    +0

    我认为这只有当存储级别为MEMORY_ONLY –

    +0

    @RockieYang你指的是* this *是什么意思? “RDD”会保存在内存中的事实? –

    +0

    我指的是http://spark.apache.org/docs/latest/programming-guide.html#rdd-persistence –