2016-03-06 94 views
7

我需要運行一個具有大量數據的火花程​​序。我正在嘗試優化Spark程序並通過Spark UI進行工作,並嘗試減少Shuffle部分。spark的shuffle讀和shuffle寫有什麼區別?

有幾個組件提及,shuffle讀取和shuffle寫入。我可以根據他們的術語理解它們之間的差異,但我想了解它們的確切含義以及spark的shuffle讀/寫中哪一個會降低性能?

我在互聯網上搜索,但無法找到關於它們的深入細節,所以想看看有沒有人可以在這裏解釋它們。

+1

Spark中的頭號優化技巧:儘量減少洗牌次數。 – LiMuBei

回答

2

我最近開始與Spark合作。我一直在尋找同樣問題的答案。

當來自一個階段的數據通過網絡混洗到下一個階段時,處理下一階段的執行者通過tcp從第一階段的進程中提取數據。我注意到每個階段的shuffle「寫入」和「讀取」指標都顯示在Spark UI中,用於特定的工作。一個階段也可能具有「輸入」大小(例如來自HDFS或蜂巢表掃描的輸入)。

我注意到從一個階段到另一個階段的洗牌寫入大小不匹配的階段洗牌讀取大小。如果我沒有記錯的話,可以在轉換到下一個階段/執行程序之前對其執行減速器類型的操作,作爲優化。也許這會導致大小的差異,並因此影響報告兩個值的相關性。

+0

您好@Dranyar,我不認爲它只是將數據傳遞到下一個階段,當您通過某種操作獲取數據局部性時執行任何組合時發生混洗。我認爲這應該與通過網絡進行特定操作的數據移動有關。您怎麼看? – Srini

+0

你的聲明中的「it」是什麼意思:「我不認爲它只是將數據傳遞到下一個階段」?我可能會感到困惑。 此外,我不確定您的意思是「獲取數據位置」。它看起來像火花歷史UI顯示任務是否發生在分區的位置本地運行。 – Dranyar

5

從UI提示

隨機讀取

總洗牌字節和讀取記錄(包括本地數據讀取和遠程執行者讀取數據

隨機寫

字節和記錄寫入磁盤以便通過洗牌讀取未來階段