我有一個RDD,它是通過讀取一個大小爲117MB的本地文本文件形成的。高速緩存後「採取」行動RDD導致只有2%高速緩存
scala> rdd
res87: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[3] at textFile at <console>:24
我緩存RDD: -
scala> rdd.persist()
res84: rdd.type = MapPartitionsRDD[3] at textFile at <console>:24
這之後我稱之爲 '取(1)' 行動對RDD強制evalulation。一旦完成,我檢查Spark UI的存儲頁面。它顯示緩存的分數僅爲2%,內存大小爲6.5MB。然後我在RDD上調用'count'的操作。在此之後,當我檢查Spark UI存儲頁面時,我突然發現這些數字現在已經改變。緩存的分數爲82%,內存大小爲258.2MB。這是否意味着即使在緩存RDD之後,Spark也只會緩存後續操作真正需要的內容(因爲需要(1)只讀取一個頂部元素)?當第二個動作「count」被觸發時,它需要觸摸所有元素,所以它最終會緩存剩餘的部分?我還沒有遇到過這樣的記錄行爲,這是一個錯誤嗎?
我還是很困惑。我明白緩存是在觸發動作時執行的,但'take'也是一個動作,即使take(1)只讀取第一個元素,但在技術上仍然是一個動作。這些文檔並沒有提到這種稱爲部分緩存的事情。只要觸發了任何操作,緩存就會發生。另外,如果我們要說它正在緩存任何正在讀的內容,那聽起來也不對,因爲第一個元素只是一行文本(遠小於1KB)。它不需要6.5MB來存儲它。 – Dhiraj
1行是你想要的,但hdfs在大塊中存儲數據(以MB爲單位)。當你問一條線時,無論如何都要讀取整個塊。當你問兩條線時,會讀取1或2個塊(線位置可能在同一個塊中或不同)。 – Zernike
但是這個例子我在我的本地系統模式下嘗試過Scala shell。所以使用的文件系統是本地文件系統。 – Dhiraj