数据倾斜?几招把你安排的板板正正的!
?🍅 作者:不吃西紅柿?
🍅 簡介:CSDN博客專家🏆、HDZ核心組成員💪、C站總榜前10名??
🍅 粉絲專屬福利:文末公號「信息技術(shù)智庫」回復(fù)「資料」領(lǐng)取
🍅 如覺得文章不錯,歡迎點贊、收藏、評論
文末下載PDF
擁有本篇PDF,意味著你擁有一本完善的書籍,本篇文章整理了數(shù)據(jù)倉庫領(lǐng)域,幾乎所有的知識點,文章內(nèi)容主要來源于以下幾個方面:
本篇文章尤其適合初級程序員準(zhǔn)備面試,以及作為工作中的指導(dǎo)手冊,對資深程序員來說也可夯實基礎(chǔ)。
當(dāng)然,技術(shù)學(xué)習(xí)僅僅依靠一篇文章還是不夠的,可加入公眾號和技術(shù)交流群(聯(lián)系方式見文末),群里有很多數(shù)據(jù)倉庫領(lǐng)域資深大佬,大家經(jīng)常在群里討論技術(shù)熱點問題、互相解決工作難題、安排內(nèi)推、甚至有部門leader直接發(fā)出崗位邀請。「西紅柿🍅」也會持續(xù)更新優(yōu)質(zhì)文章,也歡迎熱愛學(xué)習(xí)總結(jié)的小伙伴有償投稿,共同推動中國信息技術(shù)行業(yè)發(fā)展,讓我們一起加油吧!
1、數(shù)據(jù)傾斜表現(xiàn)
1.1 hadoop中的數(shù)據(jù)傾斜表現(xiàn)
- 有一個多幾個Reduce卡住,卡在99.99%,一直不能結(jié)束。
- 各種container報錯OOM
- 異常的Reducer讀寫的數(shù)據(jù)量極大,至少遠(yuǎn)遠(yuǎn)超過其它正常的Reducer
- 伴隨著數(shù)據(jù)傾斜,會出現(xiàn)任務(wù)被kill等各種詭異的表現(xiàn)。
1.2 hive中數(shù)據(jù)傾斜
一般都發(fā)生在Sql中g(shù)roup by和join on上,而且和數(shù)據(jù)邏輯綁定比較深。
?
1.3 Spark中的數(shù)據(jù)傾斜
Spark中的數(shù)據(jù)傾斜,包括Spark Streaming和Spark Sql,表現(xiàn)主要有下面幾種:
- Executor lost,OOM,Shuffle過程出錯;
- Driver OOM;
- 單個Executor執(zhí)行時間特別久,整體任務(wù)卡在某個階段不能結(jié)束;
- 正常運行的任務(wù)突然失敗;
2、數(shù)據(jù)傾斜產(chǎn)生原因
我們以Spark和Hive的使用場景為例。
在做數(shù)據(jù)運算的時候會涉及到,count distinct、group by、join on等操作,這些都會觸發(fā)Shuffle動作。一旦觸發(fā)Shuffle,所有相同key的值就會被拉到一個或幾個Reducer節(jié)點上,容易發(fā)生單點計算問題,導(dǎo)致數(shù)據(jù)傾斜。
?
一般來說,數(shù)據(jù)傾斜原因有以下幾方面:
1)key分布不均勻;
2)建表時考慮不周
舉一個例子,就說數(shù)據(jù)默認(rèn)值的設(shè)計吧,假設(shè)我們有兩張表:
????user(用戶信息表):userid,register_ip
????ip(IP表):ip,register_user_cnt
這可能是兩個不同的人開發(fā)的數(shù)據(jù)表。如果我們的數(shù)據(jù)規(guī)范不太完善的話,會出現(xiàn)一種情況:
user表中的register_ip字段,如果獲取不到這個信息,我們默認(rèn)為null;
但是在ip表中,我們在統(tǒng)計這個值的時候,為了方便,我們把獲取不到ip的用戶,統(tǒng)一認(rèn)為他們的ip為0。
?
兩邊其實都沒有錯的,但是一旦我們做關(guān)聯(lián)了,這個任務(wù)會在做關(guān)聯(lián)的階段,也就是sql的on的階段卡死。
?
3)業(yè)務(wù)數(shù)據(jù)激增
比如訂單場景,我們在某一天在北京和上海兩個城市多了強力的推廣,結(jié)果可能是這兩個城市的訂單量增長了10000%,其余城市的數(shù)據(jù)量不變。
?
然后我們要統(tǒng)計不同城市的訂單情況,這樣,一做group操作,可能直接就數(shù)據(jù)傾斜了。
?
3、解決數(shù)據(jù)傾斜思路
很多數(shù)據(jù)傾斜的問題,都可以用和平臺無關(guān)的方式解決,比如更好的數(shù)據(jù)預(yù)處理,異常值的過濾等。因此,解決數(shù)據(jù)傾斜的重點在于對數(shù)據(jù)設(shè)計和業(yè)務(wù)的理解,這兩個搞清楚了,數(shù)據(jù)傾斜就解決了大部分了。
1)業(yè)務(wù)邏輯
我們從業(yè)務(wù)邏輯的層面上來優(yōu)化數(shù)據(jù)傾斜,比如上面的兩個城市做推廣活動導(dǎo)致那兩個城市數(shù)據(jù)量激增的例子,我們可以單獨對這兩個城市來做count,單獨做時可用兩次MR,第一次打散計算,第二次再最終聚合計算。完成后和其它城市做整合。
2)程序?qū)用?/strong>
比如說在Hive中,經(jīng)常遇到count(distinct)操作,這樣會導(dǎo)致最終只有一個Reduce任務(wù)。
我們可以先group by,再在外面包一層count,就可以了。比如計算按用戶名去重后的總用戶量:
?
(1)優(yōu)化前?
只有一個reduce,先去重再count負(fù)擔(dān)比較大:
select name,count(distinct name)from user;
(2)優(yōu)化后
// 設(shè)置該任務(wù)的每個job的reducer個數(shù)為3個。Hive默認(rèn)-1,自動推斷。
set mapred.reduce.tasks=3;
// 啟動兩個job,一個負(fù)責(zé)子查詢(可以有多個reduce),另一個負(fù)責(zé)count(1):
select count(1) from (select name from user group by name) tmp;
?
3)調(diào)參方面
Hadoop和Spark都自帶了很多的參數(shù)和機制來調(diào)節(jié)數(shù)據(jù)傾斜,合理利用它們就能解決大部分問題。
?
4)從業(yè)務(wù)和數(shù)據(jù)上解決數(shù)據(jù)傾斜
很多數(shù)據(jù)傾斜都是在數(shù)據(jù)的使用上造成的。我們舉幾個場景,并分別給出它們的解決方案。
?
一個原則:盡早過濾每個階段的數(shù)據(jù)量。
添加公眾號「信息技術(shù)智庫」:
🍅 硬核資料:20G,8大類資料,關(guān)注即可領(lǐng)取(PPT模板、簡歷模板、技術(shù)資料)
🍅 技術(shù)互助:技術(shù)群大佬指點迷津,你的問題可能不是問題,求資源在群里喊一聲。
🍅 面試題庫:由各個技術(shù)群小伙伴們共同投稿,熱乎的大廠面試真題,持續(xù)更新中。
🍅 知識體系:含編程語言、算法、大數(shù)據(jù)生態(tài)圈組件(Mysql、Hive、Spark、Flink)、數(shù)據(jù)倉庫、前端等。
👇👇送書抽獎丨技術(shù)互助丨粉絲福利👇👇
總結(jié)
以上是生活随笔為你收集整理的数据倾斜?几招把你安排的板板正正的!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排序(冒泡、选择、插入、希尔、快排、堆排
- 下一篇: 埋点技术:“呵呵,你在网上的一举一动,都