快取Apache Spark RDD - 效能調優

banq發表於2019-01-08

有時您需要多次處理RDD,而不是一次操作。這帶來了一個主要問題...... Spark 確實總是會在磁碟上找到資料。但是你需要處理效能問題。

RDD帶有cache()和persist()方法,其中
 cache() = persist(StorageLevel.MEMORY_ONLY).將幫助我們將RDD儲存到記憶體中,詳細瞭解其他選項

讓我們用簡單的例子來測試它:

import org.apache.spark.storage.StorageLevel._;

val fileRDD = sc.textFile("/tests/yahoo_stocks.csv");

fileRDD.persist(MEMORY_ONLY);

System.out.println("Count of RDD (first run): "+fileRDD.count());

System.out.println("Count of RDD (second run): "+fileRDD.count());


(download the yahoo_stocks.csv from https://github.com/dmatrix/examples/blob/master/spark/hdp/data/yahoo_stocks.csv)

現在讓我告訴你發生了什麼:
如果沒有持久化(MEMORY_ONLY)呼叫,首先呼叫fileRDD.count()將觸發從磁碟獲取資料和計數行。fileRDD.count()的第二次命中意味著同樣的事情。
透過持久(MEMORY_ONLY)呼叫,我們告訴Spark:
做懶載入:
  • 讀取檔案
  • 將RDD快取到記憶體中

現在第二次呼叫fileRDD.count()應該比第一次呼叫快得多,因為它不會使用磁碟作為計算內容的源(當然,如果RDD適合記憶體)
讓我們證明一下(執行):

park-shell -i test14.scala


第一次
 fileRDD.count() 執行輸出:

18/02/17 22:21:10 INFO DAGScheduler: Job 0 finished: count at <console>:33,  
took 1,425495 s
Count of RDD (first run): 4794


第二次 fileRDD.count() 執行輸出

18/02/17 22:21:11 INFO DAGScheduler: Job 1 finished: count at <console>:33,  
took 0,121783 s
Count of RDD (second run): 4794

看看第二個RDD動作的巨大加速。

相關文章