pysaprk數據傾斜怎麼解決?

一、數據傾斜危害?

單個或少數的節點數據量特別大,但一個 Stage 所耗費的時間,是由最慢的那個 Task 決定,所以數據傾斜會導致兩個後果:

  1. OOM(單或少數的節點);
  2. 拖慢整個Job執行時間(其他已經完成的節點都在等這個還在做的節點)。

二、數據傾斜的現象

當發現如下現象時,十有八九是發生數據傾斜了:

  • 絕大多數 task 執行得都非常快,但個別 task 執行極慢,整體任務卡在某個階段不能結束。

  • 原本能夠正常執行的 Spark 作業,某天突然報出 OOM(內存溢出)異常。

三、導致Spark數據傾斜的本質

在進行 shuffle 的時候,必須將各個節點上相同的 key 拉取到某個節點上的一個 task 來進行處理,比如按照 key 進行聚合或 join 等操作。此時如果某個 key 對應的數據量特別大的話,就會發生數據傾斜。比如大部分 key 對應10條數據,但是個別 key 卻對應了100萬條數據,那麼大部分 task 可能就只會分配到10條數據,然後1秒鐘就運行完了;但是個別 task 可能分配到了100萬數據,要運行一兩個小時。

四、定位最慢的Task所處的源碼位置

步驟一:看數據傾斜發生在哪個stage。yarn-client模式下查看本地log或Spark Web UI中當前運行的是哪個stage;yarn-cluster模式下,通過Spark Web UI查看運行到了哪個Stage。

主要看最慢的Stage各task分配的數據量,來確定是否是數據傾斜。

步驟二:根據Stage劃分,推算傾斜發生的代碼(必然有Shuffle類算子)。

根據stage劃分原理,推算出來發生傾斜的那個stage對應代碼中的哪一部分,這部分代碼中肯定會有一個shuffle類算子。簡單實用方法:只要看到shuffle類算子或Spark SQL的SQL語句會有Shuffle類的算子的句子,就可以知道該地方劃分爲前後兩個Stage。(用Python的PySpark接口,Spark Web UI會查看task在源碼中的行數。)

、解決方案

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章