2017-08-17 148 views
0

我有一個非常典型的RDD場景,我收集一些數據,堅持下來,然後多次使用持續RDD進行各種轉換。堅持把速度提高一個數量級,所以堅持是絕對有必要的。爲什麼spark MEMORY_AND_DISK比MEMORY_ONLY慢?

但我很驚訝不同的持續方法的相對速度。如果我堅持使用MEMORY_AND_DISK,那麼隨後每次使用持久RDD需要比使用MEMORY_ONLY時長10%。這是爲什麼?如果數據適合內存,我會期望它們具有相同的速度,並且如果某些分區不適合內存,我預計MEMORY_AND_DISK會更快。爲什麼我的時間表總是不表明這是真的?

+0

但是,如果緩存被丟棄,則需要重新查詢數據。這些查詢速度較慢,比寫入/讀取磁盤緩存緩慢一個數量級。 – Darryl

回答

0

您的CPU通常以大約10 Gb/s的速度訪問內存,而訪問SSD需要600 Mb/s 使用父rdds分區重新計算選擇MEMORY_ONLY時不適合內存的分區。如果沒有廣泛的相依性,應該沒問題

+0

也許我錯過了一些東西,但我不認爲這解釋了我所看到的。父RDD直接從數據庫查詢數據,而且速度很慢。這就是爲什麼如果我刪除調用persist(),它比我堅持的時間長10倍。如果使用MEMORY_ONLY時分區不適合內存,是不是必須重新計算,因爲它沒有調用持久化,這比MEMORY_AND_DISK慢?如果它適合內存,MEMORY_AND_DISK不會像MEMORY_ONLY一樣快,因爲它不必去磁盤? – Darryl

+0

是的,磁盤僅在內存空間不足時使用,因此它應該是相同的。 當您的數據存儲在您的磁盤上時,它可能是用於序列化過程。如果可以,請嘗試使用kryo序列化程序: conf.set(「spark.serializer」,「org.apache.spark.serializer.KryoSerializer」) – Tiffany

+0

我會試試看。 – Darryl

0

這是不可能說沒有上下文,但至少有兩種情況MEMORY_AND_DISK

  • 數據超出了可用內存更大 - 與MEMORY_AND_DISK分區上的不適合內存將存儲在磁盤上。
  • 分區已從內存中刪除 - MEMORY_AND_DISK存儲在磁盤上,其中MEMORY_ONLY已丟失,必須重新計算,並且驅逐可能會觸發大型GC掃描。

最後,你要記住,_DISK可以使用不同級別的硬件和軟件的緩存等等不同的塊可能與可比主存儲器的速度進行訪問。