2017-10-06 96 views
0

我調查一個Spark SQL作業(火花1.6.0),其表現不佳的原因橫跨200個分區嚴重偏斜數據偏斜,大部分數據是1個分區: Index,ID,Attempt,Status,Locality Level,Executor ID/Host,Launch Time,Duration,GC Time,Shuffle Read Size/Records 什麼我想知道...是否有Spark界面中的任何內容幫助我瞭解有關數據如何分區的更多信息?從看這個我不知道哪些列的數據框分區。我怎麼能找到這個? (除了查看代碼 - 我想知道日誌和/或UI中是否有任何內容可以幫助我)?確定爲什麼數據是Spark

其他細節,這是使用Spark的數據幀API,Spark版本1.6。底層數據以鑲木地板格式存儲。

回答

1

Spark用戶界面和日誌不會非常有用的。 Spark幾乎所有東西都使用simple hash partitioning算法作爲默認值。正如你在這裏看到的,這基本上可以回收Java hashCode方法。

我建議如下:

  • 嘗試通過採樣來調試和打印RDD或數據幀中的內容。查看密鑰的數據分佈是否存在明顯的問題(即低差異或低基數)。
  • 如果這不起作用,您可以從日誌和用戶界面開始重新計算我們有多少分區。您可以使用spark找到數據的hashCode,然後取模數來查看碰撞是什麼。

一旦你找到了碰撞,你可以嘗試一些技巧源將其刪除:

  • 看看是否有更好的鍵,你可以使用
  • 看看你是否可以提高hashCode (Java中的默認值不是那麼好)
  • 查看是否可以通過執行初始分散/聚集步驟來強制執行一些並行操作並減少該分區的處理開銷兩步來處理數據。這可能是爲了適應這裏提到的那些最棘手的優化。基本上,使用隨機數生成器對數據進行一次劃分,以強制數據的初始並行組合,然後使用自然劃分器再次將其推入,以獲得最終結果。這就要求你應用的操作是傳遞和關聯的。這種技術會對網絡造成兩次攻擊,因此非常昂貴,除非數據實際上是高度偏斜的。
+0

「看看是否有更好的鑰匙可以使用」在撰寫本文時,我不知道當前使用的鑰匙是什麼。我基本上想知道是否有從UI或日誌中知道的方法。到目前爲止我還沒有找到任何東西。 – jamiet

+0

如果您可以使用您正在使用的API和版本(Spark SQL,Spark的Hive,數據框架,數據集,RDD)以及某些基礎詳細信息(例如您使用的文件格式)的詳細信息更新您的問題作爲輸入,它將更容易提供更多的建議。 –

+0

Ed。當然,完成了。 – jamiet

相關問題