資料傾斜解決方案

2021-09-11 20:59:59 字數 1945 閱讀 5842

資料傾斜定義

簡單的講,資料傾斜就是我們在資料計算的時候,由於資料的分散度不夠,導致大量的資料集中到了一台或者幾台機器上計算,這些機器的計算速度遠遠低於整個集群的平均計算速度,導致整個計算過程十分緩慢。

常見資料傾斜現象

資料傾斜往往會發生在資料開發的各個環節中,比如:

● 用hive資料計算的時候reduce階段卡在99.99%

● 用sparkstreaming做實時演算法的時候,一直會有executor出現oom的錯誤,但是其餘的executor記憶體使用率卻很低。

hadoop中的資料傾斜主要表現在ruduce階段卡在99.99%,一直99.99%不能結束。

這裡如果詳細看日誌或者監控介面的話會發現:

● 有乙個或幾個reduce卡住

● 各種container報錯oom(記憶體溢位)

● 讀寫的資料量極大,至少遠遠超過其它正常的reduce

伴隨著資料傾斜,會出現任務被kill等各種詭異的表現。

經驗:hive的資料傾斜,一般都發生在sql中group和on上,而且和資料邏輯繫結比較深。

產生的原因

以hive為例,我們在做資料運算的時候,往往會涉及到count distinct、group by、join等操作,這些都會觸發shuffle動作,一旦觸發,所有相同key的值就會拉到乙個或幾個節點上,就容易發生單點問題,造成資料傾斜。

如何解決:

舉乙個例子:

比如就說訂單場景吧,我們在某一天在北京和上海兩個城市多了強力的推廣,結果可能是這兩個城市的訂單量增長了10000%,其餘城市的資料量不變。

然後我們要統計不同城市的訂單情況,這樣,一做group操作,可能直接就資料傾斜了。

解決資料傾斜有這幾個思路:

(1)業務邏輯,我們從業務邏輯的層面上來優化資料傾斜,比如上面的例子,我們單獨對這兩個城市來做count,最後和其它城市做整合。

(2)程式層面,比如說在hive中,經常遇到count(distinct)操作,distinct會導致group by無法在map階段做一次聚合操作,導致資料在傳輸到reduce端時,資料量未能減少,reduce如果需要處理的資料量太大,就會導致整個job很難完成,我們可以先group 再在外麵包一層count,就可以了。

如:select day, count(distinct id) as uv from lxw1234 group by day;

1可以轉換成:

select day, count(id) as uv from (select day,id from lxw1234 group by day,id)a group by day;

1(3)調參方面,hadoop和spark都自帶了很多的引數和機制來調節資料傾斜,合理利用它們就能解決大部分問題。如:

在hive中,通過設定hive.groupby.skewindata=true來自動進行負載均衡。

如:select count(distinct uid) from *** group by ***,當選項設定為 true,生成的查詢計畫會有兩個 job。第乙個 mr job 中,map 的輸出結果集合會隨機分布到reduce 中,每個 reduce 做部分聚合操作,並輸出結果,這樣處理的結果是相同的 group by key有可能被分發到不同的 reduce 中,從而達到負載均衡的目的;第二個 mr job 再根據預處理的資料結果按照 group bykey 分布到 reduce 中(這個過程可以保證相同的 group by key 被分布到同乙個 reduce中),最後完成最終的聚合操作。

但是,當選項設定為 true時,hive不支援多列上的去重操作,如以下會報錯:

select ip, count(distinctuid), count(distinct uname) fromlog group by ip;

(4)mapjoin:當大表關聯乙個小表時,容易發生資料傾斜,通過mapjoin把小表資料全部載入到內存在map端進行join,避免reducer處理。

參考資料:

資料傾斜解決方案

1 聚合原資料 主要操作的是hive資料庫中的資料,先通過hive sql將相同key的資料聚合成一條資料,再進行map操作 當沒辦法聚合成一條資料時 增大key粒度,從而key的數量會減少,但是每個key對應的資料量會增大,key之間的資料量差異可能會減少。2 過濾導致傾斜的key 3 提高shu...

MR資料傾斜解決方案

1.資料傾斜 由於mapreduce程式是按照key的hash值進行分割槽的 如果某些單詞特別多 特別多的單詞就會被分到同乙個reduce去處理 有些reducere任務處理的資料量小 有些reduce任務處理的資料量非常大 只有所有的reduce任務完成以後job才算完成 造成job的工作時間變長...

資料傾斜的解決方案

目錄 方案一 硬編碼 方案二 map join 方案1 硬編碼,將傾斜的值打散。方案2 map join 背景 多張表在進行關聯時,可能有乙個key的值非常多,導致某個reduce處理時間過久,此時產生了資料傾斜。方案1是用拆分空值和總量較多的key值進行優化。舉例 table 2和table 1關...