2017-08-31 69 views
2

我正在學習火花並對作業調度和洗牌依存關係有疑問。在這裏,DAG,我發現there理解火花中的洗牌

enter image description here

正如我們在Stage 33看到我們有多個操作:groupByjoingroupByjoin。問題是我不太明白爲什麼兩個groupBy的操作都放在同一個階段?我認爲groupBy需要改組,我們DAGScheduler應該將Stage 33分成兩個階段,包含單個groupByjoin

回答

3

攪亂此處階段之間表示爲界限:

  • 階段30 - 第一階段33
  • 階段31 - 第一階段33
  • 階段32 - 第一階段33

一旦數據已被洗牌,所有洗牌RDDs使用相同的分區最終join是1-1依賴(如果所有部分已經在同一行動中執行,它也是本地的,由於搭配),並且不需要額外的洗牌階段。

1

Shuffling是跨分區(又稱重新分區)重新分配數據的過程,這些分區可能會導致跨越JVM進程或甚至通過線路(在獨立機器上的執行者之間)移動數據。

在你的情況下,在並行化步驟之間進行混洗 - 階段30,31,32作爲輸入,最終階段33作爲目標成對。

不惜一切代價避免洗牌。考慮如何利用現有分區,或使用Broadcast變量並嘗試減少數據傳輸。 有關在Spark中洗牌的更多信息,您可以閱讀here