什麼是資料傾斜,怎麼解決資料傾斜?

2021-10-23 17:48:53 字數 1225 閱讀 4471

相信很多接觸mapreduce的朋友對『資料傾斜』這四個字並不陌生,那麼究竟什麼是資料傾斜?又改怎樣解決這種該死的情況呢?

何為資料傾斜?

正常的資料分布理論上都是傾斜的,就是我們所說的2-8原理:80%的財富集中在20%的人手中,80%的使用者只使用20%的功能,20%的使用者貢獻了80%的訪問量,不同的資料字段的資料傾斜一般有兩種情況:

一種是唯一值非常少,極少數值有非常多大記錄值;

一種是唯一值比較多,這個欄位的某些值有遠遠多於其他值的記錄數,但是它的佔比也小於百分之一或千分之一

資料傾斜:

資料傾斜在mapreduce程式設計模型中十分常見,用通俗易懂的話來說,資料傾斜無非就是大量的相同key被partition分配到乙個分割槽裡,造成了『乙個人累死,其他人閒死』的情況,這種情況是我們不能接受的,這也違背了平行計算的初衷,首先乙個節點要承受著巨大的壓力,而其他節點計算完畢後要一直等待這個忙碌的節點,也拖累了整體的計算時間,可以說效率是十分低下的。

解決方案「

1. 增加jvm記憶體,這適用於第一種情況(唯一值非常少,極少數值有非常多的記錄值),這種情況下,往往只能通過硬體的手段來進行調優,增加jvm記憶體可以顯著提高執行效率。

2. 增加reduce的個數,這適用於第二種情況(唯一值比較多,這個欄位的某些值又遠遠多於其他值的記錄數,但是它的佔比也小於百分之一或千分之一),我們知道,這種情況下,最容易造成的結果就是大量相同的key被partition到乙個分割槽,從而乙個reduce執行了大量的工作,而如果我們增加了reduce的個數,這種情況相對來說會減輕很多,畢竟計算的節點多了,就算工作量還是不均勻,那也要小很多。

3.自定義分割槽,這需要使用者自己繼承partition類,指定分割槽策略,這種方式效果比較顯著。

4. 重新設計key,有一種方案是在map階段時給key加上乙個隨機數,有了隨機數的key就不會被大量的分配到同一節點,待到reduce後再把隨機數去掉即可。

5. 使用combinner合併,combinner是再map階段,reduce之前的乙個中間階段,在這個階段可以選擇性的把大量的相同key資料先進行乙個合併,可以看做是local reduce,然後再交給reduce來處理,這個做的好處很多,即減輕了map端和reduce端中間的shuffle階段的資料拉取數量,推薦使用這種方法。

怎麼解決資料傾斜問題?

本文面向的讀者是從事資料分析 資料處理 etl 等相關工作的朋友們,相信大家在工作中一定遇到過資料傾斜的問題,讀完本文,你會了解到資料傾斜的定義及其危害 產生的原因及應對措施 常見傾斜場景及解決辦法等知識,相信對你今後處理資料傾斜問題會有一定的幫助。目前流行的大資料相關的計算框架之所以能夠處理大量的...

解決資料傾斜問題

方法 解決資料傾斜問題 解決方法1.user id為空的不參與關聯,例如 1 2 3 4 5 6 7 8 9 select fromlog a joinbmw users b ona.user idisnotnull anda.user id b.user id unionall select fr...

Spark sql 資料傾斜解決

一次資料查詢,簡單的表關聯,在某個stage 長時間running 檢視spark ui 發現 兩階段 inputsize 相差巨大,有明顯資料傾斜 解決 其中乙個表為維度表,資料量較小考慮 提供map join 判斷閥值 set spark.sql.autobroadcastjointhresho...