2016-07-26 72 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 –