熱線電話:13121318867

登錄
首頁大數據時代Hadoop數據傾斜產生的原因是什么?如何進行處理?
Hadoop數據傾斜產生的原因是什么?如何進行處理?
2020-07-20
收藏

大數據處理時我們經常會遇到數據傾斜的問題,尤其是在數據量過大時,數據傾斜可能會導致各種各樣的問題。Hadoop數據傾斜主要表現為:ruduce階段卡在99.99%,而且是一直99.99%不能結束。

具體來說就是:mapreduce程序執行時,reduce節點大部分已經執行完畢,但是其中會有一個或者幾個reduce節點運行速度很慢,從而使得整個程序的處理時間很長。原因是:某一個key的條數比其他key多出太多,因此這條key所在的reduce節點所處理的數據量就比其他節點就大很多,這也就造成了某幾個節點遲遲運行不完。由于Hive是分階段執行的,map處理數據量的差異,取決于上一個stage的reduce輸出,因此將數據均勻的分配到各個reduce中,這一點是解決數據傾斜的關鍵。

一、Hadoop數據傾斜常見情形

二、Hadoop數據傾斜產生原因

1.Hadoop框架的特性

A、Hadoop不怕數據大,但是怕數據傾斜

B、Jobs 數多的作業運行效率會相對比較低

C、countdistinct、group by、join等操作,觸發了Shuffle動作,導致全部相同key的值聚集在一個或幾個節點上,很容易發生單點問題。

2.具體原因

A:key 分布不均勻,某一個key的條數比其他key多太多

B:業務數據自帶的特性

C:建表時考慮不全面

D:可能某些 HQL 語句自身就存在數據傾斜 問題

三、Hadoop數據傾斜處理

1、從業務和數據方面解決數據傾斜

(1)有損的方法:找到異常數據。

(2)無損的方法:

對分布不均勻的數據,進行單獨計算

首先對key做一層hash,把數據打散,讓它的并行度變大,之后進行匯集

(3)數據預處理

2、Hadoop平臺的解決方法

(1)針對join產生的數據傾斜

A.大表和小表join產生的數據傾斜

a.在多表關聯情況下,將小表(關聯鍵記錄少的表)依次放到前面,這樣能夠觸發reduce端減少操作次數,從而減少運行時間。

b.同時使用Map Join讓小表緩存到內存。在map端完成join過程,這樣就能省掉redcue端的工作。需要注意:這一功能使用時,需要開啟map-side join的設置屬性:set hive.auto.convert.join=true(默認是false)

還可以對使用這個優化的小表的大小進行設置:set hive.mapjoin.smalltable.filesize=25000000(默認值25M)

B.大表和大表的join產生的數據傾斜

a.j將異常值賦一個隨機值,以此來分散key,均勻分配給多個reduce去執行

b.如果key值都是有效值的情況下,需要設置以下幾個參數來解決

set hive.exec.reducers.bytes.per.reducer = 1000000000

也就是每個節點的reduce,其 默認是處理數據地大小為1G,如果join 操作也產生了數據傾斜,那么就在hive 中設定

set hive.optimize.skewjoin = true;

set hive.skewjoin.key = skew_key_threshold (default = 100000)

(2)group by 造成的數據傾斜

解決方式相對簡單:

hive.map.aggr=true  (默認true) 這個配置項代表是否在map端進行聚合,相當于Combiner

hive.groupby.skewindata

(3)count(distinct)或者其他參數不當造成的數據傾斜

A.reduce個數太少

set mapred.reduce.tasks=800

B.HiveQL中包含count(distinct)時

使用sum...group byl來替代。例如select a,sum(1) from (select a, b from t group by a,b) group by a;

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢