hadoop mr hive資料傾斜解決

2021-10-02 18:59:54 字數 4994 閱讀 5841

資料傾斜是進行大資料計算時常見的問題。主要分為map端傾斜和reduce端傾斜,map端傾斜主要是因為輸入檔案大小不均勻導致,reduce端主要是partition不均勻導致。

在hive中遇到資料傾斜的解決辦法:

一、傾斜原因:map端緩慢,輸入資料檔案多,大小不均勻

當出現小檔案過多,需要合併小檔案。可以通過set hive.merge.mapfiles=true來解決。

set hive.map.aggr=true; //map端部分聚合,相當於combiner,可以減小壓力(預設開啟)

set hive.groupby.skewindata=true(預設關閉);//有資料傾斜的時候進行負載均衡,當選項設定為 true,生成的查詢計畫會有兩個 mr job。第乙個 mr job 中,map 的輸出結果集合會隨機分布到 reduce 中,每個 reduce 做部分聚合操作,並輸出結果,這樣處理的結果是相同的 group by key 有可能被分發到不同的 reduce 中,從而達到負載均衡的目的;第二個 mr job 再根據預處理的資料結果按照 group by key 分布到 reduce 中(這個過程可以保證相同的 group by key 被分布到同乙個 reduce 中),最後完成最終的聚合操作。

單個檔案大小稍稍大於配置的block塊的大寫,此時需要適當增加map的個數。解決方法:set mapred.map.tasks個數

檔案大小適中,但map端計算量非常大,如select id,count(*),sum(case when...),sum(case when...)...需要增加map個數。解決方法:set mapred.map.tasks個數,set mapred.reduce.tasks個數

二、當遇到乙個大表和乙個小表進行join操作時

解決方法:小表在join左側,大表在右側,或使用mapjoin 將小表載入到記憶體中。然後再對比較大的表進行map操作。

join就發生在map操作的時候,這裡的join並不會涉及reduce操作。map端join的優勢就是在於沒有shuffle,

如:select /*+ mapjoin(a) */ 

a.c1, b.c1 ,b.c2 from a join b 

where a.c1 = b.c1; 

三、遇到需要進行join的但是關聯欄位有資料為null,如表一的id需要和表二的id進行關聯,null值的reduce就會落到乙個節點上

解決方法1:子查詢中過濾掉null值,id為空的不參與關聯

解決方法2:用case when給空值分配隨機的key值(字串+rand())

四、不同資料型別關聯產生資料傾斜

場景:一張表s8的日誌,每個商品一條記錄,要和商品表關聯。但關聯卻碰到傾斜的問題。s8的日誌中有字串商品id,也有數字的商品id,型別是string的,但商品中的數字id是bigint的。猜測問題的原因是把s8的商品id轉成數字id做hash來分配reduce,所以字串id的s8日誌,都到乙個reduce上了,解決的方法驗證了這個猜測。

解決方法:把數字型別轉換成字串型別

select * from s8_log a

left outer join r_auction_auctions b

on a.auction_id = cast(b.auction_id as string);

五、當hiveql中包含count(distinct)時

如果資料量非常大,執行如select a,count(distinct b) from t group by a;型別的sql時,會出現資料傾斜的問題。

解決方法:使用sum...group by代替。如select a,sum(1) from (select a, b from t group by a,b) group by a;

六、join和group的優化

2.1 對於普通的join操作,會在map端根據key的hash值,shuffle到某乙個reduce上去,在reduce端做join連線操作,記憶體中快取join左邊的表,遍歷右邊的表,一次做join操作。所以在做join操作時候,將資料量多的表放在join的右邊。 

當資料量比較大,並且key分布不均勻,大量的key都shuffle到乙個reduce上了,就出現了資料的傾斜。 

在map端產生join

mapjoin的主要意思就是,當鏈結的兩個表是乙個比較小的表和乙個特別大的表的時候,我們把比較小的table直接放到記憶體中去,然後再對比較大的**進行map操作。join就發生在map操作的時候,每當掃瞄乙個大的table中的資料,就要去去檢視小表的資料,哪條與之相符,繼而進行連線。這裡的join並不會涉及reduce操作。map端join的優勢就是在於沒有shuffle,

2.2 對於group操作,首先在map端聚合,最後在reduce端坐聚合,hive預設是這樣的,以下是相關的引數 

· hive.map.aggr = true是否在 map 端進行聚合,預設為 true 

· hive.groupby.mapaggr.checkinterval = 100000在 map 端進行聚合操作的條目數目

自己總結:

1 map join 開啟配置引數

set hive.auto.convert.join = true  設定自動選擇mapjoin

set hive.mapjoin.smalltable.filesize = 25000000  大表小標的閾值設定,預設是25m

2 map 預聚合 ( count group by經常用到)

set hive.map.aggr = true;  設定預設在map端進行聚合;

hive.groupby.mapaggr.checkinterval = 100000; 在map端進行聚合操作的條目數目;

hive.groupby.skewindata = true; 有資料傾斜時在map端進行負載均衡,預設false, 本質是提交了兩個job, 第乙個job的mr進行負載均衡預處理;

hadoop mr過程優化

1 資料輸入

1) 合併小檔案:在執行mr任務之前將小檔案進行合併,大量的小檔案會產生大量的map任務,增到map任務裝載次數,任務裝載比較耗時。

2) 採用combinetextinputformat來作為輸入,解決輸入端大量小檔案的場景。

2 map階段

1)減少溢寫spill次數:通過調整環形緩衝區io.sort.mb和sort.spill.percent引數值,增大觸發spill記憶體上限,減少spill次數,從而減少磁碟io。

2)減少合併merge次數:通過調整io.sort.factor引數,增大merge檔案數目,減少merge次數,從而縮短mr時間。

3)能應用combine的盡量應用,減少io。應用場景是聚合sum等計算,但如果是求平均值等就不合適了。

3 reduce階段

1)合理設定map reduce數量: 兩個不能太少也不能太多。太少會導致task等待,延長處理時間;太多,會導致map reduce間競爭資源,造成處理超時等錯誤。

2)設定map reduce共存:調整slowstart.completedmaps引數,使map執行到一定程度之後,reduce也開始執行,減少reduce等待時間。

3)規避使用reduce:因為reduce在用於連線資料集時會產生大量的網路消耗。

4)合理設定reduce端的buffer:預設情況下,當資料大於一定閾值的時候,buffer中的資料會寫入磁碟,然後reduce會從磁碟中讀取資料,有大量的磁碟io。既然有這個弊端,可以引數設定,使得buffer中的資料直接輸送到reduce, 從而減少io開銷。設定mapred.job.reduce.input.buffer.percent,預設為0.0。當值大於0的時候,會保留制定比例的記憶體讀取buffer資料直接拿給reduce使用。這樣一來,設定buffer、讀取資料、reduce計算都需要記憶體,所以需要根據作業運**況進行設定。

4 io傳輸

2)使用sequencefile二進位制檔案。

5 資料傾斜問題

1)抽樣和範圍分割槽:

通過對原始資料進行抽樣得到的結果集來預設分割槽邊界值。

2)自定義分割槽:根據具體業務中鍵值的業務背景來自定義分割槽。

3)combine:相當於在map端進行reduce,預聚合,儘量減少輸出,應用場景是聚合sum等計算,但如果是求平均值等就不合適了。

4)採用map join,避免採用reduce join。

6 常用引數調優

hadoop 小檔案優化

1)hadoop archive

一種檔案存檔工具,對內依然是多個檔案,對外namenode而言只占用乙個檔案的150byte儲存,減少了namenode記憶體使用。

2) sequence file

由一系列二進位制key/value組成,如果key為檔名,value為檔案內容,可以將大批小檔案合併成乙個大檔案。

3)combinefileinputformat

是一種新的inputformat,用於將多個檔案合併成乙個單獨的file split, 另外會考慮資料的儲存位置。

4) 開啟jvm重用

對於大量的小檔案job, 開啟重用可以減少45%時間。

乙個map task執行在乙個jvm上,開啟重用的話,該map在jvm上執行完畢之後,jvm會繼續執行其他map task。

PyCharm設定注釋字型顏色以及是否傾斜的操作

更多程式設計教程請到 菜鳥教程 高州陽光論壇 如下所示 italic是是否傾斜。blod是否加粗。foreground是字型顏色。background背景色。補充知識 pycharm預設注釋字型大小不一的解決方法 再使用pycharm的過程中我們可能會發現注釋的字型大小不一的情況 注釋中文字大小不一...

鳳舞傾絕,為君一生

黃昏點降唇,朦夜朧月醉。初然心雖碎,憶亦伊之淚。初學舞那年那日,你曾說嗜好我的舞,此後為了你一人而舞。重逢此世,也願為君終身輕舞,尤記當初的琴箏和鳴的冷落餘音,似君所如,稀少之至。墜下的斑點似流瀾的水色紗衣,披一襲彎曲的靛青素綢,孤注一擲的凝眸象你斷然離別的偏差,逼近著月弦,對月微笑。初見的檯子上,...

傾轉旋翼飛行模擬(基於X plane XV 15)

前言 和傳統一樣,受限於固定翼的起降需求和 的航程與速度限制,誕生了接觸一下傾轉旋翼的想法。但是我一沒有科研需求,二沒有專案支撐,於是決定從x plane當中做出一些嘗試,體驗一下。圖1是我製作的xplane模型第一次飛行的場景,沒有意外,此模型粗糙,無法實現垂直起降 也無法實現傾轉飛行。只能在短距...