發現資料傾斜的時候,不要急於提高 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過程中遇到同...