解決 spark 中的資料傾斜問題

2021-09-25 11:53:12 字數 2337 閱讀 5730

發現資料傾斜的時候,不要急於提高 executor 的資源,修改引數

或是修改程式,首先要檢查資料本身,是否存在異常資料。 

1、資料問題造成的資料傾斜 

找出異常的 key 

如果任務長時間卡在最後最後 1 個(幾個)任務,首先要對 key 進行

抽樣分析,判斷是哪些 key 造成的。

選取 key,對資料進行抽樣,統計出現的次數,根據出現次數大小排序取

出前幾個。 

比如:

df.select(「key」).sample(false,0.1).(k=>(k,1)).reducebykey(+).ma

p(k=>(k._2,k._1)).sortbykey(false).take(10) 

如果發現多數資料分布都較為平均,而個別資料比其他資料大上若

幹個數量級,則說明發生了資料傾斜。 

經過分析,傾斜的資料主要有以下三種情況: 

1、null(空值)或是一些無意義的資訊()之類的,大多是這個原因

引起。 

2、無效資料,大量重複的測試資料或是對結果影響不大的有效數

據。 

3、有效資料,業務導致的正常資料分布。 

解決辦法 

第 1,2 種情況,直接對資料進行過濾即可(因為該資料對當前業

務不會產生影響)。 

第 3 種情況則需要進行一些特殊操作,常見的有以下幾種做法 

(1) 隔離執行,將異常的 key 過濾出來單獨處理,最後與正常資料

的處理結果進行 union 操作。 

(2) 對 key 先新增隨機值,進行操作後,去掉隨機值,再進行一次

操作。 

(3) 使用 reducebykey 代替 groupbykey(reducebykey 用於對每個

key 對應的多個 value 進行 merge 操作,最重要的是它能夠在本地先進行

merge 操作,並且 merge 操作可以通過函式自定義.)

 (4) 使用 map join。 

案例

 如果使用 reducebykey 因為資料傾斜造成執行失敗的問題。具體操

作流程如下: 

(1) 將原始的 key 轉化為 key + 隨機值(例如 random.nextint) 

(2) 對資料進行 reducebykey(func) 

(3) 將 key + 隨機值 轉成 key 

(4) 再對資料進行 reducebykey(func) 

案例操作流程分析: 

 假設說有傾斜的 key,我們給所有的 key 加上乙個隨機數,然後進

行 reducebykey 操作;此時同乙個 key 會有不同的隨機數字首,在進行

reducebykey 操作的時候原來的乙個非常大的傾斜的 key 就分而治之變成

若干個更小的 key,不過此時結果和原來不一樣,怎麼破?進行 map 操

作,目的是把隨機數字首去掉,然後再次進行 reducebykey 操作。(當

然,如果你很無聊,可以再次做隨機數字首),這樣我們就可以把原本傾

斜的 key 通過分而治之方案分散開來,最後又進行了全域性聚合 

注意 1: 如果此時依舊存在問題,建議篩選出傾斜的資料單獨處

理。最後將這份資料與正常的資料進行 union 即可。 

注意 2: 單獨處理異常資料時,可以配合使用 map join 解決。 

2、spark 使用不當造成的資料傾斜 

提高 shuffle 並行度 

dataframe 和 sparksql 可以設定 spark.sql.shuffle.partitions

引數控制 shuffle 的併發度,預設為 200。 

rdd 操作可以設定 spark.default.parallelism 控制併發度,預設

引數由不同的 cluster manager 控制。 

侷限性: 只是讓每個 task 執行更少的不同的 key。無法解決個別

key 特別大的情況造成的傾斜,如果某些 key 的大小非常大,即使乙個

task 單獨執行它,也會受到資料傾斜的困擾。 

使用 map join 代替 reduce join 

在小表不是特別大(取決於你的 executor 大小)的情況下使用,可

以使程式避免 shuffle 的過程,自然也就沒有資料傾斜的困擾了.(詳細見

 侷限性: 因為是先將小資料傳送到每個 executor 上,所以資料量

不能太大。

spark解決資料傾斜問題

參考 資料傾斜發生的原理 資料傾斜的原理很簡單 在進行shuffle的時候,必須將各個節點上相同的key拉取到某個節點上的乙個task來進行處理,比如按照key進行聚合或join等操作。此時如果某個key對應的資料量特別大的話,就會發生資料傾斜。比如大部分key對應10條資料,但是個別key卻對應了...

解決spark中遇到的資料傾斜問題

多數task執行速度較快,少數task執行時間非常長,或者等待很長時間後提示你記憶體不足,執行失敗。常見於各種shuffle操作,例如reducebykey,groupbykey,join等操作。key本身分布不均勻 包括大量的key為空 key的設定不合理 shuffle時的併發度不夠 計算方式有...

spark資料傾斜問題

資料傾斜 加更大記憶體 跟cpu硬體是效能優化的根本之道 一 資料傾斜帶來的致命性後果 1.oom 根本原因資料太多 一般oom都是由於資料傾斜所致,spark基於jvm之上的 2.速度非常慢 二 資料傾斜的基本特徵 1.任務分配不均勻 2.個別task處理過度大量的資料 shuffle過程中遇到同...