
作者:dantezhao
前言:
數(shù)據(jù)傾斜是大數(shù)據(jù)領(lǐng)域繞不開(kāi)的攔路虎,當(dāng)你所需處理的數(shù)據(jù)量到達(dá)了上億甚至是千億條的時(shí)候,數(shù)據(jù)傾斜將是橫在你面前一道巨大的坎。
邁的過(guò)去,將會(huì)海闊天空!邁不過(guò)去,就要做好準(zhǔn)備:很可能有幾周甚至幾月都要頭疼于數(shù)據(jù)傾斜導(dǎo)致的各類詭異的問(wèn)題。
文章結(jié)構(gòu)
簡(jiǎn)單的講,數(shù)據(jù)傾斜就是我們?cè)谟?jì)算數(shù)據(jù)的時(shí)候,數(shù)據(jù)的分散度不夠,導(dǎo)致大量的數(shù)據(jù)集中到了一臺(tái)或者幾臺(tái)機(jī)器上計(jì)算,這些數(shù)據(jù)的計(jì)算速度遠(yuǎn)遠(yuǎn)低于平均計(jì)算速度,導(dǎo)致整個(gè)計(jì)算過(guò)程過(guò)慢。
1、關(guān)鍵字:數(shù)據(jù)傾斜
相信大部分做數(shù)據(jù)的童鞋們都會(huì)遇到數(shù)據(jù)傾斜,數(shù)據(jù)傾斜會(huì)發(fā)生在數(shù)據(jù)開(kāi)發(fā)的各個(gè)環(huán)節(jié)中,比如:
這些問(wèn)題經(jīng)常會(huì)困擾我們,辛辛苦苦等了幾個(gè)小時(shí)的數(shù)據(jù)就是跑不出來(lái),心里多難過(guò)啊。
例子很多,這里先隨便舉兩個(gè),后文會(huì)詳細(xì)的說(shuō)明。
2、關(guān)鍵字:千億級(jí)
為什么要突出這么大數(shù)據(jù)量?先說(shuō)一下筆者自己最初對(duì)數(shù)據(jù)量的理解:
數(shù)據(jù)量大就了不起了?數(shù)據(jù)量少,機(jī)器也少,計(jì)算能力也是有限的,因此難度也是一樣的。憑什么數(shù)據(jù)量大就會(huì)有數(shù)據(jù)傾斜,數(shù)據(jù)量小就沒(méi)有?
這樣理解也有道理,但是比較片面,舉兩個(gè)場(chǎng)景來(lái)對(duì)比:
兩個(gè)公司都部署了 Hadoop 集群。假設(shè)現(xiàn)在遇到了數(shù)據(jù)傾斜,發(fā)生什么?
公司一的數(shù)據(jù)分時(shí)童鞋在做 join 的時(shí)候發(fā)生了數(shù)據(jù)傾斜,會(huì)導(dǎo)致有幾百萬(wàn)用戶的相關(guān)數(shù)據(jù)集中到了一臺(tái)服務(wù)器上,幾百萬(wàn)的用戶數(shù)據(jù),說(shuō)大也不大,正常字段量的數(shù)據(jù)的話64G還是能輕松處理掉的。
公司二的數(shù)據(jù)分時(shí)童鞋在做 join 的時(shí)候也發(fā)生了數(shù)據(jù)傾斜,可能會(huì)有1個(gè)億的用戶相關(guān)數(shù)據(jù)集中到了一臺(tái)機(jī)器上了(相信我,這很常見(jiàn)),這時(shí)候一臺(tái)機(jī)器就很難搞定了,最后會(huì)很難算出結(jié)果。
筆者大部分的數(shù)據(jù)傾斜問(wèn)題都解決了,而且也不想重新運(yùn)行任務(wù)來(lái)截圖,下面會(huì)分幾個(gè)場(chǎng)景來(lái)描述一下數(shù)據(jù)傾斜的特征,方便讀者辨別。
由于Hadoop和Spark是最常見(jiàn)的兩個(gè)計(jì)算平臺(tái),下面就以這兩個(gè)平臺(tái)說(shuō)明:
Hadoop中直接貼近用戶使用的是 Mapreduce 程序和 Hive 程序,雖說(shuō) Hive 最后也是用 MR 來(lái)執(zhí)行(至少目前 Hive 內(nèi)存計(jì)算并不普及),但是畢竟寫的內(nèi)容邏輯區(qū)別很大,一個(gè)是程序,一個(gè)是 Sql,因此這里稍作區(qū)分。
Hadoop 中的數(shù)據(jù)傾斜主要表現(xiàn)在、ruduce 階段卡在99.99%,一直99.99%不能結(jié)束。
這里如果詳細(xì)的看日志或者和監(jiān)控界面的話會(huì)發(fā)現(xiàn):
伴隨著數(shù)據(jù)傾斜,會(huì)出現(xiàn)任務(wù)被 kill 等各種詭異的表現(xiàn)。
經(jīng)驗(yàn):Hive 的數(shù)據(jù)傾斜,一般都發(fā)生在 Sql 中 Group 和 On上,而且和數(shù)據(jù)邏輯綁定比較深。
2、Spark中的數(shù)據(jù)傾斜
Spark 中的數(shù)據(jù)傾斜也很常見(jiàn),這里包括 Spark Streaming和 Spark Sql,表現(xiàn)主要有下面幾種:
補(bǔ)充一下,在 Spark streaming 程序中,數(shù)據(jù)傾斜更容易出現(xiàn),特別是在程序中包含一些類似 sql 的 join、group 這種操作的時(shí)候。 因?yàn)?Spark Streaming 程序在運(yùn)行的時(shí)候,我們一般不會(huì)分配特別多的內(nèi)存,因此一旦在這個(gè)過(guò)程中出現(xiàn)一些數(shù)據(jù)傾斜,就十分容易造成 OOM。
1、數(shù)據(jù)傾斜產(chǎn)生的原因
我們以 Spark 和 Hive 的使用場(chǎng)景為例。他們?cè)谧鰯?shù)據(jù)運(yùn)算的時(shí)候會(huì)設(shè)計(jì)到,countdistinct、group by、join 等操作,這些都會(huì)觸發(fā) Shuffle 動(dòng)作,一旦觸發(fā),所有相同 key 的值就會(huì)拉到一個(gè)或幾個(gè)節(jié)點(diǎn)上,就容易發(fā)生單點(diǎn)問(wèn)題。
2、萬(wàn)惡的shuffle
Shuffle 是一個(gè)能產(chǎn)生奇跡的地方,不管是在 Spark 還是 Hadoop 中,它們的作用都是至關(guān)重要的。關(guān)于 Shuffle 的原理,這里不再講述,看看 Hadoop 相關(guān)的論文或者文章理解一下就 ok。這里主要針對(duì),在 Shuffle如何產(chǎn)生了數(shù)據(jù)傾斜。
Hadoop 和 Spark 在 Shuffle 過(guò)程中產(chǎn)生數(shù)據(jù)傾斜的原理基本類似。如下圖。
大部分數(shù)據(jù)傾斜的原理就類似于下圖,很明了,因?yàn)閿?shù)據(jù)分布不均勻,導(dǎo)致大量的數(shù)據(jù)分配到了一個(gè)節(jié)點(diǎn)。
3、從數(shù)據(jù)角度來(lái)理解數(shù)據(jù)傾斜
我們舉一個(gè)例子,就說(shuō)數(shù)據(jù)默認(rèn)值的設(shè)計(jì)吧,假設(shè)我們有兩張表:
這可能是兩個(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)了會(huì)出現(xiàn)什么情況,這個(gè)任務(wù)會(huì)在做關(guān)聯(lián)的階段,也就是 sql 的 on 的階段卡死。
4、從業(yè)務(wù)計(jì)角度來(lái)理解數(shù)據(jù)傾斜
數(shù)據(jù)往往和業(yè)務(wù)是強(qiáng)相關(guān)的,業(yè)務(wù)的場(chǎng)景直接影響到了數(shù)據(jù)的分布。
再舉一個(gè)例子,比如就說(shuō)訂單場(chǎng)景吧,我們?cè)谀骋惶煸诒本┖蜕虾蓚€(gè)城市多了強(qiáng)力的推廣,結(jié)果可能是這兩個(gè)城市的訂單量增長(zhǎng)了10000%,其余城市的數(shù)據(jù)量不變。
然后我們要統(tǒng)計(jì)不同城市的訂單情況,這樣,一做 group 操作,可能直接就數(shù)據(jù)傾斜了。
如何解決
數(shù)據(jù)傾斜的產(chǎn)生是有一些討論的,解決它們也是有一些討論的,本章會(huì)先給出幾個(gè)解決數(shù)據(jù)傾斜的思路,然后對(duì) Hadoop 和 Spark 分別給出一些解決數(shù)據(jù)傾斜的方案。
注意: 很多數(shù)據(jù)傾斜的問(wèn)題,都可以用和平臺(tái)無(wú)關(guān)的方式解決,比如更好的數(shù)據(jù)預(yù)處理, 異常值的過(guò)濾等,因此筆者認(rèn)為,解決數(shù)據(jù)傾斜的重點(diǎn)在于對(duì)數(shù)據(jù)設(shè)計(jì)和業(yè)務(wù)的理解,這兩個(gè)搞清楚了,數(shù)據(jù)傾斜就解決了大部分了。
1、幾個(gè)思路
解決數(shù)據(jù)傾斜有這幾個(gè)思路:
2、從業(yè)務(wù)和數(shù)據(jù)上解決數(shù)據(jù)傾斜
很多數(shù)據(jù)傾斜都是在數(shù)據(jù)的使用上造成的。我們舉幾個(gè)場(chǎng)景,并分別給出它們的解決方案。
數(shù)據(jù)分布不均勻:
前面提到的“從數(shù)據(jù)角度來(lái)理解數(shù)據(jù)傾斜”和“從業(yè)務(wù)計(jì)角度來(lái)理解數(shù)據(jù)傾斜”中的例子,其實(shí)都是數(shù)據(jù)分布不均勻的類型,這種情況和計(jì)算平臺(tái)無(wú)關(guān),我們能通過(guò)設(shè)計(jì)的角度嘗試解決它。
有損的方法:
找到異常數(shù)據(jù),比如 ip 為0的數(shù)據(jù),過(guò)濾掉
無(wú)損的方法:
對(duì)分布不均勻的數(shù)據(jù),單獨(dú)計(jì)算
先對(duì) key 做一層 hash,先將數(shù)據(jù)打散讓它的并行度變大,再匯集
數(shù)據(jù)預(yù)處理
3、Hadoop平臺(tái)的優(yōu)化方法
列出來(lái)一些方法和思路,具體的參數(shù)和用法在官網(wǎng)看就行了。
4、Spark平臺(tái)的優(yōu)化方法
總結(jié)
數(shù)據(jù)傾斜的坑還是很大的,如何處理數(shù)據(jù)傾斜是一個(gè)長(zhǎng)期的過(guò)程,希望本文的一些思路能提供幫助。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無(wú)論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫(kù)管理中,“大表” 始終是性能優(yōu)化繞不開(kāi)的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫(kù)表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開(kāi)始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫(kù)表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫(kù))處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開(kāi)發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫(kù)表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問(wèn)題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問(wèn)題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問(wèn)題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過(guò)程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見(jiàn)頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類分析作為 “無(wú)監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10