大数据常见问题:数据倾斜
offer收割系列介紹:
1、分享橋哥本人或小伙伴在面試大廠時(shí)遇到的真題,并給出參考答案!!如果能幫到大家,點(diǎn)贊、收藏、評(píng)論是對(duì)我最大的支持!!
2、涉及崗位:主要為大數(shù)據(jù)開(kāi)發(fā)、數(shù)據(jù)倉(cāng)庫(kù)(橋哥干過(guò)的),其它崗位也可參考
3、涵蓋技術(shù):mysql、hadoop、hive、Spark、Flink、Kudu、Impala等...
?
推薦閱讀:
★?數(shù)據(jù)倉(cāng)庫(kù)專欄:數(shù)倉(cāng)方法論、實(shí)戰(zhàn)經(jīng)驗(yàn)、面試真題(https://blog.csdn.net/weixin_39032019/category_8871528.html)
★?Python專欄:Python黑科技:爬蟲(chóng)、算法、小工具(https://blog.csdn.net/weixin_39032019/category_8974792.html)
★?大數(shù)據(jù)面試專欄:面試真題、開(kāi)發(fā)經(jīng)驗(yàn)、調(diào)優(yōu)策略(https://blog.csdn.net/weixin_39032019/category_11048805.html)
?
一、數(shù)據(jù)傾斜表現(xiàn)
1)hadoop中的數(shù)據(jù)傾斜表現(xiàn):
2)hive中數(shù)據(jù)傾斜
一般都發(fā)生在Sql中g(shù)roup by和join on上,而且和數(shù)據(jù)邏輯綁定比較深。
3)Spark中的數(shù)據(jù)傾斜
Spark中的數(shù)據(jù)傾斜,包括Spark Streaming和Spark Sql,表現(xiàn)主要有下面幾種:
二、數(shù)據(jù)傾斜產(chǎn)生原因
我們以Spark和Hive的使用場(chǎng)景為例。
他們?cè)谧鰯?shù)據(jù)運(yùn)算的時(shí)候會(huì)涉及到,count distinct、group by、join on等操作,這些都會(huì)觸發(fā)Shuffle動(dòng)作。一旦觸發(fā)Shuffle,所有相同key的值就會(huì)被拉到一個(gè)或幾個(gè)Reducer節(jié)點(diǎn)上,容易發(fā)生單點(diǎn)計(jì)算問(wèn)題,導(dǎo)致數(shù)據(jù)傾斜。
一般來(lái)說(shuō),數(shù)據(jù)傾斜原因有以下幾方面:
1)key分布不均勻
2)建表時(shí)考慮不周
我們舉一個(gè)例子,就說(shuō)數(shù)據(jù)默認(rèn)值的設(shè)計(jì)吧,假設(shè)我們有兩張表:
user(用戶信息表):userid,register_ip
ip(IP表):ip,register_user_cnt
這可能是兩個(gè)不同的人開(kāi)發(fā)的數(shù)據(jù)表。如果我們的數(shù)據(jù)規(guī)范不太完善的話,會(huì)出現(xiàn)一種情況:
user表中的register_ip字段,如果獲取不到這個(gè)信息,我們默認(rèn)為null;
但是在ip表中,我們?cè)诮y(tǒng)計(jì)這個(gè)值的時(shí)候,為了方便,我們把獲取不到ip的用戶,統(tǒng)一認(rèn)為他們的ip為0。
兩邊其實(shí)都沒(méi)有錯(cuò)的,但是一旦我們做關(guān)聯(lián)了,這個(gè)任務(wù)會(huì)在做關(guān)聯(lián)的階段,也就是sql的on的階段卡死。
3)業(yè)務(wù)數(shù)據(jù)激增
比如訂單場(chǎng)景,我們?cè)谀骋惶煸诒本┖蜕虾蓚€(gè)城市多了強(qiáng)力的推廣,結(jié)果可能是這兩個(gè)城市的訂單量增長(zhǎng)了10000%,其余城市的數(shù)據(jù)量不變。
然后我們要統(tǒng)計(jì)不同城市的訂單情況,這樣,一做group操作,可能直接就數(shù)據(jù)傾斜了。
三、解決數(shù)據(jù)傾斜思路
很多數(shù)據(jù)傾斜的問(wèn)題,都可以用和平臺(tái)無(wú)關(guān)的方式解決,比如更好的數(shù)據(jù)預(yù)處理,異常值的過(guò)濾等。因此,解決數(shù)據(jù)傾斜的重點(diǎn)在于對(duì)數(shù)據(jù)設(shè)計(jì)和業(yè)務(wù)的理解,這兩個(gè)搞清楚了,數(shù)據(jù)傾斜就解決了大部分了。
1)業(yè)務(wù)邏輯
我們從業(yè)務(wù)邏輯的層面上來(lái)優(yōu)化數(shù)據(jù)傾斜,比如上面的兩個(gè)城市做推廣活動(dòng)導(dǎo)致那兩個(gè)城市數(shù)據(jù)量激增的例子,我們可以單獨(dú)對(duì)這兩個(gè)城市來(lái)做count,單獨(dú)做時(shí)可用兩次MR,第一次打散計(jì)算,第二次再最終聚合計(jì)算。完成后和其它城市做整合。
2)程序?qū)用?/strong>
比如說(shuō)在Hive中,經(jīng)常遇到count(distinct)操作,這樣會(huì)導(dǎo)致最終只有一個(gè)Reduce任務(wù)。
我們可以先group by,再在外面包一層count,就可以了。比如計(jì)算按用戶名去重后的總用戶量:
(1)優(yōu)化前
只有一個(gè)reduce,先去重再count負(fù)擔(dān)比較大: select name,count(distinct name)from user;
(2)優(yōu)化后
// 設(shè)置該任務(wù)的每個(gè)job的reducer個(gè)數(shù)為3個(gè)。Hive默認(rèn)-1,自動(dòng)推斷。
set mapred.reduce.tasks=3;
// 啟動(dòng)兩個(gè)job,一個(gè)負(fù)責(zé)子查詢(可以有多個(gè)reduce),另一個(gè)負(fù)責(zé)count(1):
select count(1) from (select name from user group by name) tmp;
3)調(diào)參方面
Hadoop和Spark都自帶了很多的參數(shù)和機(jī)制來(lái)調(diào)節(jié)數(shù)據(jù)傾斜,合理利用它們就能解決大部分問(wèn)題。
詳見(jiàn):
1、hive 參數(shù)設(shè)置大全:https://blog.csdn.net/weixin_39032019/article/details/111912916
2、spark-submit 參數(shù)設(shè)置:https://blog.csdn.net/weixin_39032019/article/details/103371674
3、kudu 參數(shù)設(shè)置:https://blog.csdn.net/weixin_39032019/article/details/110534549
4)從業(yè)務(wù)和數(shù)據(jù)上解決數(shù)據(jù)傾斜
很多數(shù)據(jù)傾斜都是在數(shù)據(jù)的使用上造成的。我們舉幾個(gè)場(chǎng)景,并分別給出它們的解決方案。
?
我是橋哥,專注分享大數(shù)據(jù)知識(shí)體系?& Python黑科技。
求點(diǎn)贊、求評(píng)論、求收藏!!
總結(jié)
以上是生活随笔為你收集整理的大数据常见问题:数据倾斜的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Material Design风格登录注
- 下一篇: 冈萨雷斯《数字图像处理》读书笔记(十一)