2015-06-04 154 views
1

我已經開始學習Spark並且目前正在運行WordCount實驗(統計文本文件中每個單詞出現的次數)。 該文件被放置在網絡掛載的共享文件系統中。 我有一個集羣1主和5執行者(每個都有:處理器AMD Opteron 1.7 Ghz,24核心,48GB RAM,250GB存儲)。Apache Spark性能

我已經離開了星火的默認配置爲

我已經注意到了,我第一次運行該程序,我得到一個較長的執行時間的時刻(如spark.executor.memory =512米),這降低在第二次,第三次運行。 例如,對於一個40GB的文件的執行時間爲:

  1. 第一次執行:419.769396小號
  2. 第二次執行:176.242206小號
  3. 第三個執行:134.411345小號
  4. 四執行:126.052158小號
  5. 第五次執行:126.287600 s

我正在運行它:

> ./spark-submit --class com.spark.example.WordCount --master spark://master:7077 wordCountOriginal.jar /data/input40GB 

WordCount的代碼與Spark提供的示例完全相同。

我不明白爲什麼第一次執行和下一次執行之間會有如此大的差異。我認爲緩存是答案,但從我讀的Spark緩存中執行結果中的中間結果,但在這裏有不同的執行。

謝謝!

+0

我認爲這種差異可能更多地沿着將可重用數據對象進行池化或在活動實例的內存中保持加載類的方式。 (免責聲明:我沒有與Spark合作過)。 –

回答

0

這是因爲Spark有一個緩存機制。第一次運行後,Spark將緩存執行結果。您可以在此page閱讀更多關於此。祝你好運!

+0

對於更深的潛水 - 在引擎蓋下,這是由於spark沒有在shuffle文件上調用fsync,所以它將被寫入OS緩衝區緩存 –

+0

謝謝!那麼,如果我評估性能,平均執行幾次執行時間還是僅執行第一次執行時間更準確? –

+0

@JustinPihony那些是獨立運行的。 Spark系統中不應該存在以前運行的任何「內存」。對我來說,它看起來像純粹的操作系統緩存'熱門'文件。 – maasg

0

爲了消除執行時間中的這些差異,每次執行後,我停止了主節點和節點,並手動清除OS緩存。經過更多的調查,我認爲Spark只處理內存緩存,並且只在服務器運行時從緩存中刪除,並且使用LRU(最近最少使用)策略從緩存中刪除數據。沒有手動清除緩存,我仍然看到執行時間遞減模式。

+0

正確。火花緩存並不是這裏的罪魁禍首。首先,你必須明確地指定數據應該被緩存,而字數計數例子不會這樣做。其次,高速緩存生存期與Spark上下文的生命週期相關聯。每個提交的作業都會創建一個新的Spark上下文。 –