很可惜 T 。T 您現(xiàn)在還不是作者身份,不能自主發(fā)稿哦~
如有投稿需求,請把文章發(fā)送到郵箱tougao@appcpx.com,一經(jīng)錄用會有專人和您聯(lián)系
咨詢?nèi)绾纬蔀榇河鹱髡哒埪?lián)系:鳥哥筆記小羽毛(ngbjxym)
這是我的第64篇原創(chuàng)
數(shù)據(jù)傾斜是上帝對某個服務(wù)器的過于偏愛。
上帝太過于偏愛某個服務(wù)器,因此給他分配了太多的任務(wù),導(dǎo)致數(shù)據(jù)都傾斜到這臺服務(wù)器了。
在大數(shù)據(jù)場景中,無論是MapReduce還是Spark,都會因兩階段之間的shuffle導(dǎo)致各個服務(wù)器接受到的數(shù)據(jù)導(dǎo)致處理量失衡的問題。情況嚴(yán)重,就變成數(shù)據(jù)傾斜了。
我們之所以創(chuàng)造分布式環(huán)境,就是因為我們將一個巨大的任務(wù)拆解成若干個小任務(wù),給不同的服務(wù)器執(zhí)行,這樣總執(zhí)行時間就會減小至1/n。理想狀態(tài)的任務(wù)處理情況應(yīng)該如下圖所示:
原本單機環(huán)境需要執(zhí)行100s的任務(wù),由5臺服務(wù)器共同執(zhí)行,每臺服務(wù)器執(zhí)行20s,最后總時間會遠遠大于單機環(huán)境的執(zhí)行時間。而且我們還可以通過不斷增加服務(wù)器,來不斷減少總運行時間。但是往往會出現(xiàn)這種情況:
某4臺服務(wù)器很快就執(zhí)行完了任務(wù),但是其中有一臺服務(wù)器的遲遲不能完成,嚴(yán)重的時候甚至?xí)﨩OM(Out Of Memory)。究其原因,其實如同上面說過的,在分布式處理的不同階段之間會有一個混洗(shuffle)的過程:
在Map或者Spark的Stage1階段,由于每個數(shù)據(jù)塊的大小都是一致的(默認(rèn)128M),所以在這個階段是不會出現(xiàn)數(shù)據(jù)傾斜的。但是一旦我們對數(shù)據(jù)進行Shuffle,比如按照商品品類進行分組之后,在Reduce或Stage2階段,數(shù)據(jù)將會出現(xiàn)嚴(yán)重的傾斜:原本每臺服務(wù)器都只需要處理3條數(shù)據(jù),Shuffle之后,其中兩臺服務(wù)器各只需處理1條,而剩余的那臺服務(wù)器則需要執(zhí)行8條數(shù)據(jù)。三臺服務(wù)器處理的數(shù)據(jù)量比為7:1:1。數(shù)據(jù)傾斜至第一臺服務(wù)器。任務(wù)延遲,甚至OOM。
如何解決數(shù)據(jù)傾斜呢:
三個層面:
1、預(yù)判-原始數(shù)據(jù)預(yù)防,保證原始數(shù)據(jù)不傾斜;
2、躲閃-規(guī)避數(shù)據(jù)傾斜,盡量規(guī)避Shuffle;
3、硬剛-處理數(shù)據(jù)傾斜,無法規(guī)避Shuffle,用各種辦法優(yōu)化Shuffle過程。
雖說HDFS的數(shù)據(jù)都是128M,不會一開始就出現(xiàn)數(shù)據(jù)傾斜,但是仍然有以下幾種情況:
1、數(shù)據(jù)壓縮后,128M文件大小一樣,但是數(shù)據(jù)量不一樣;
2、存在不可切分的大文件;
3、流式數(shù)據(jù)。
這幾種情況還是可能會導(dǎo)致程度不一的數(shù)據(jù)傾斜的。我們需要做一些簡單的處理:
1、數(shù)據(jù)壓縮后,128M文件大小一樣,但是數(shù)據(jù)量不一樣;
解決辦法:壓縮前,保證每個文件中的數(shù)據(jù)量基本一致;
2、存在不可切分的大文件;
解決辦法:生成數(shù)據(jù)時,盡量減少不可切分的文件,盡量按照HDFS的邏輯,存成可切分的文件;或者保證這些大文件中的數(shù)據(jù)量基本一致,且單機可處理。
3、流式數(shù)據(jù);
解決辦法:Kafka的partition實現(xiàn)建議使用隨機、輪詢等方法,盡量使各topic的各partition的數(shù)據(jù)盡量平衡。
既然我們知道數(shù)據(jù)傾斜的主要原因的shuffle導(dǎo)致的,那么我們首要的優(yōu)化方向就是shuffle,能不用盡量不要用。有以下幾種方法我們可以規(guī)避:
4、ETL預(yù)處理
在面對無法避免的原始數(shù)據(jù)傾斜(Hive表中key分布不均勻、kafka中某topic的partititoner含有業(yè)務(wù)屬性,天然不均勻等),我們可以通過前置ETL過程,進行預(yù)處理。
注意:這個方法只是將成本轉(zhuǎn)嫁,并沒有解決問題。適合削峰填谷類的操作,比如我們將數(shù)據(jù)預(yù)處理好,避免凌晨集中計算的時候處理時間過長,影響其他任務(wù)。
5、過濾不必要的key
很多數(shù)據(jù)分析師在單體數(shù)據(jù)庫的時候,就有一個不好的習(xí)慣:總喜歡select *。在hive、spark等分布式環(huán)境中,就吃苦頭了,經(jīng)常遇到數(shù)據(jù)傾斜甚至OOM。有經(jīng)驗的數(shù)據(jù)分析師在寫sql的時候,通常會先group by一下,看看數(shù)據(jù)的分布情況,然后再處理。
咱在分布式環(huán)境中也可以做類似的事情,就是采樣。
離線環(huán)境可以用隨機采樣,實時環(huán)境可以用魚塘采樣。采樣能夠快速摸清楚各個key的大致分布。掃一眼數(shù)據(jù)量大的key,如果跟你的計算沒啥關(guān)系,直接過濾就行。
比如上面舉的例子,母嬰品類占絕大多數(shù),但是運營的要求是分析3C產(chǎn)品,那你過濾掉母嬰產(chǎn)品,一則減少計算量,二則規(guī)避了數(shù)據(jù)傾斜的問題。
6、Reduce join 改為Map join
如果是大小表的join,比如訂單表和訂單類型、訂單狀態(tài)的join,如果使用reduce join的話,就非常容易在shuflle之后出現(xiàn)數(shù)據(jù)傾斜。建議的原則:只要一臺服務(wù)器的內(nèi)存能吃下這張小表(主要看服務(wù)器內(nèi)存大小,建議2g以內(nèi),再大就影響服務(wù)器性能了),就建議用map join。這樣join完之后,每份數(shù)據(jù)依然是基本均衡的,而且規(guī)避了shuffle導(dǎo)致數(shù)據(jù)傾斜的問題。
上述幾步,能做的都做了,還是不行,那就只能硬剛了。這時就只能八仙過海各顯神通了?;镜倪壿嬤€是一樣的,就是能拆的盡量拆,不能拆的用空間換時間,或者自定義。
7、通用優(yōu)化:shuffle并行度
spark的shuffle并行度默認(rèn)值是200,建議根據(jù)服務(wù)器的情況進行調(diào)整。一般是集群cpu總和的2-3倍。當(dāng)發(fā)生數(shù)據(jù)傾斜的時候,適當(dāng)增大并行度,可以讓任務(wù)和數(shù)據(jù)更均勻的分布在整個集群中。但是這個調(diào)優(yōu)方法有些玄學(xué)成分在,因為你不知道他是咋分過去的。
并行度調(diào)整有三個方法:
●操作函數(shù)內(nèi)設(shè)置
testRDD.groupByKey(200)
●代碼中設(shè)置“spark.default.parallelism”
conf.set("spark.default.parallelism", 200)
●配置文件中設(shè)置“$SPARK_HOME/conf/spark-defaults.conf” 文件
spark.default.parallelism 200
8、拆分超大key
前面說過采樣后過濾。如果采樣之后發(fā)現(xiàn)這個key還是你需要的,無法怎么辦?那就把超大數(shù)據(jù)量的key拆分出來,單獨做成一個任務(wù),這樣超大數(shù)據(jù)量的key一個任務(wù),其他中小數(shù)據(jù)量的key一個任務(wù),兩個任務(wù)分別做join啊什么的處理,最后把結(jié)果合并一下就行了。
為了避免超大數(shù)據(jù)量的key單獨join的時候還是一個key一個任務(wù),可以在key上加上隨機數(shù)取模的前綴,這樣就把數(shù)據(jù)分成了N份,然后再join。
9、階段拆分-兩階段聚合
對于聚合類的操作,這種方式可以說是數(shù)據(jù)傾斜的大殺器。簡單來說就是在需要聚合的key前加一個隨機數(shù)取模的前綴,這樣就能得到非常均勻的key,然后按這個加工之后的key進行第一次聚合之后,再對聚合的結(jié)果,按照原始key進行二次聚合,這樣基本就不可能出現(xiàn)數(shù)據(jù)傾斜了。示意圖如下:
對比之前的例子中,處理母嬰的服務(wù)器和處理3c、圖書的服務(wù)器任務(wù)量是7:1:1,這個方案的數(shù)據(jù)就非常均勻了。
10、任務(wù)拆分
很多時候數(shù)據(jù)情況會非常復(fù)雜,有null值、有超大數(shù)據(jù)量的key、還有各種需要過濾的數(shù)據(jù),還有各種聚合和join。那這個時候就需要把任務(wù)再拆分。一部分用上面的key值過濾,一部分用Map Join,一部分用超大key單獨處理。
11、隨機前綴
前面說過小表join的時候可以用Map join。但是遇到大表join大表咋辦?三個方法:1、大表拆成小表,多次join;2、SortMergeJoin;3、位圖法(詳見《位圖法搞定10億用戶量用戶標(biāo)簽處理》)。
那大表+中表,該咋處理?可以考慮用隨機前綴+RDD擴容的方法解決join的問題。
如果你將要join的表不大不小,又不適合用上面大大表的處理方法,那就可以用這個通用的join方法。簡單來說,就是對A表中需要join的字段加上n以內(nèi)的隨機數(shù)前綴,然后再把B表中的數(shù)據(jù)復(fù)制N份,join的字段加上1-N的前綴,然后量表再join,就能解決數(shù)據(jù)傾斜的問題了。示意如下:
原始數(shù)據(jù)如下:
不經(jīng)處理直接join是這樣的,part1很明顯比part2要多好幾倍的數(shù)據(jù):
我們對A表和B表進行隨機前綴和RDD擴容處理之后:
然后再join,這樣每個part的數(shù)據(jù)就非常均勻了:
這個方法比較坑的是B表這個RDD需要擴容,要復(fù)制N份,對內(nèi)存要求比較高。但是這個方法可以說是通殺Join的數(shù)據(jù)傾斜問題。
12、自定義partitioner
上面說改spark的并行數(shù)也可以改善數(shù)據(jù)傾斜,但是有點玄學(xué)的意思在里面。其根本原因就是不管你怎么調(diào)優(yōu),計算引擎的分區(qū)都是按照固定的方法進行的,根本不會,也沒辦法考慮數(shù)據(jù)真實情況。
無論是二階段聚合解決聚合的問題,還是隨機前綴+RDD擴容解決join的問題,都是通用解決辦法,而且還麻煩。其實最好的解決辦法就是根據(jù)現(xiàn)在處理的這份數(shù)據(jù),單獨寫一個適合的partitioner。比如現(xiàn)在是按省份進行匯總數(shù)據(jù),如果只是簡單的按省份去分(這并沒有錯),那么數(shù)據(jù)肯定會傾斜,因為各省的數(shù)據(jù)天然不一樣。我們可以通過歷史數(shù)據(jù)、抽樣數(shù)據(jù)或者一些常識,對數(shù)據(jù)進行人工分區(qū),讓數(shù)據(jù)按照我們自定義的分區(qū)規(guī)則比較均勻的分配到不同的task中。
常見的分區(qū)方式:
隨機分區(qū):每個區(qū)域的數(shù)據(jù)基本均衡,簡單易用,偶爾出現(xiàn)傾斜,但是特征同樣也會隨機打散。
輪詢分區(qū):絕對不會傾斜,但是需要提前預(yù)知分成若干份,進行輪詢。
hash散列:可以針對某個特征進行hash散列,保證相同特征的數(shù)據(jù)在一個區(qū),但是極容易出現(xiàn)數(shù)據(jù)傾斜。
范圍分區(qū):需要排序,臨近的數(shù)據(jù)會被分在同一個區(qū),可以控制分區(qū)數(shù)據(jù)均勻。
數(shù)據(jù)傾斜并不可怕,咱可以糙一些,也可以精致一些。但是建議還是糙一些,這樣簡單粗暴,多節(jié)省一些時間干(xue)點(dong)別(xi)的
往期精彩回顧
干貨 | 架構(gòu)師帶你細細的捋一遍MapReduce全流程
干貨 | bitmap解決超大表join實戰(zhàn)案例
本文為作者獨立觀點,不代表鳥哥筆記立場,未經(jīng)允許不得轉(zhuǎn)載。
《鳥哥筆記版權(quán)及免責(zé)申明》 如對文章、圖片、字體等版權(quán)有疑問,請點擊 反饋舉報
我們致力于提供一個高質(zhì)量內(nèi)容的交流平臺。為落實國家互聯(lián)網(wǎng)信息辦公室“依法管網(wǎng)、依法辦網(wǎng)、依法上網(wǎng)”的要求,為完善跟帖評論自律管理,為了保護用戶創(chuàng)造的內(nèi)容、維護開放、真實、專業(yè)的平臺氛圍,我們團隊將依據(jù)本公約中的條款對注冊用戶和發(fā)布在本平臺的內(nèi)容進行管理。平臺鼓勵用戶創(chuàng)作、發(fā)布優(yōu)質(zhì)內(nèi)容,同時也將采取必要措施管理違法、侵權(quán)或有其他不良影響的網(wǎng)絡(luò)信息。
一、根據(jù)《網(wǎng)絡(luò)信息內(nèi)容生態(tài)治理規(guī)定》《中華人民共和國未成年人保護法》等法律法規(guī),對以下違法、不良信息或存在危害的行為進行處理。
1. 違反法律法規(guī)的信息,主要表現(xiàn)為:
1)反對憲法所確定的基本原則;
2)危害國家安全,泄露國家秘密,顛覆國家政權(quán),破壞國家統(tǒng)一,損害國家榮譽和利益;
3)侮辱、濫用英烈形象,歪曲、丑化、褻瀆、否定英雄烈士事跡和精神,以侮辱、誹謗或者其他方式侵害英雄烈士的姓名、肖像、名譽、榮譽;
4)宣揚恐怖主義、極端主義或者煽動實施恐怖活動、極端主義活動;
5)煽動民族仇恨、民族歧視,破壞民族團結(jié);
6)破壞國家宗教政策,宣揚邪教和封建迷信;
7)散布謠言,擾亂社會秩序,破壞社會穩(wěn)定;
8)宣揚淫穢、色情、賭博、暴力、兇殺、恐怖或者教唆犯罪;
9)煽動非法集會、結(jié)社、游行、示威、聚眾擾亂社會秩序;
10)侮辱或者誹謗他人,侵害他人名譽、隱私和其他合法權(quán)益;
11)通過網(wǎng)絡(luò)以文字、圖片、音視頻等形式,對未成年人實施侮辱、誹謗、威脅或者惡意損害未成年人形象進行網(wǎng)絡(luò)欺凌的;
12)危害未成年人身心健康的;
13)含有法律、行政法規(guī)禁止的其他內(nèi)容;
2. 不友善:不尊重用戶及其所貢獻內(nèi)容的信息或行為。主要表現(xiàn)為:
1)輕蔑:貶低、輕視他人及其勞動成果;
2)誹謗:捏造、散布虛假事實,損害他人名譽;
3)嘲諷:以比喻、夸張、侮辱性的手法對他人或其行為進行揭露或描述,以此來激怒他人;
4)挑釁:以不友好的方式激怒他人,意圖使對方對自己的言論作出回應(yīng),蓄意制造事端;
5)羞辱:貶低他人的能力、行為、生理或身份特征,讓對方難堪;
6)謾罵:以不文明的語言對他人進行負(fù)面評價;
7)歧視:煽動人群歧視、地域歧視等,針對他人的民族、種族、宗教、性取向、性別、年齡、地域、生理特征等身份或者歸類的攻擊;
8)威脅:許諾以不良的后果來迫使他人服從自己的意志;
3. 發(fā)布垃圾廣告信息:以推廣曝光為目的,發(fā)布影響用戶體驗、擾亂本網(wǎng)站秩序的內(nèi)容,或進行相關(guān)行為。主要表現(xiàn)為:
1)多次發(fā)布包含售賣產(chǎn)品、提供服務(wù)、宣傳推廣內(nèi)容的垃圾廣告。包括但不限于以下幾種形式:
2)單個帳號多次發(fā)布包含垃圾廣告的內(nèi)容;
3)多個廣告帳號互相配合發(fā)布、傳播包含垃圾廣告的內(nèi)容;
4)多次發(fā)布包含欺騙性外鏈的內(nèi)容,如未注明的淘寶客鏈接、跳轉(zhuǎn)網(wǎng)站等,誘騙用戶點擊鏈接
5)發(fā)布大量包含推廣鏈接、產(chǎn)品、品牌等內(nèi)容獲取搜索引擎中的不正當(dāng)曝光;
6)購買或出售帳號之間虛假地互動,發(fā)布干擾網(wǎng)站秩序的推廣內(nèi)容及相關(guān)交易。
7)發(fā)布包含欺騙性的惡意營銷內(nèi)容,如通過偽造經(jīng)歷、冒充他人等方式進行惡意營銷;
8)使用特殊符號、圖片等方式規(guī)避垃圾廣告內(nèi)容審核的廣告內(nèi)容。
4. 色情低俗信息,主要表現(xiàn)為:
1)包含自己或他人性經(jīng)驗的細節(jié)描述或露骨的感受描述;
2)涉及色情段子、兩性笑話的低俗內(nèi)容;
3)配圖、頭圖中包含庸俗或挑逗性圖片的內(nèi)容;
4)帶有性暗示、性挑逗等易使人產(chǎn)生性聯(lián)想;
5)展現(xiàn)血腥、驚悚、殘忍等致人身心不適;
6)炒作緋聞、丑聞、劣跡等;
7)宣揚低俗、庸俗、媚俗內(nèi)容。
5. 不實信息,主要表現(xiàn)為:
1)可能存在事實性錯誤或者造謠等內(nèi)容;
2)存在事實夸大、偽造虛假經(jīng)歷等誤導(dǎo)他人的內(nèi)容;
3)偽造身份、冒充他人,通過頭像、用戶名等個人信息暗示自己具有特定身份,或與特定機構(gòu)或個人存在關(guān)聯(lián)。
6. 傳播封建迷信,主要表現(xiàn)為:
1)找人算命、測字、占卜、解夢、化解厄運、使用迷信方式治??;
2)求推薦算命看相大師;
3)針對具體風(fēng)水等問題進行求助或咨詢;
4)問自己或他人的八字、六爻、星盤、手相、面相、五行缺失,包括通過占卜方法問婚姻、前程、運勢,東西寵物丟了能不能找回、取名改名等;
7. 文章標(biāo)題黨,主要表現(xiàn)為:
1)以各種夸張、獵奇、不合常理的表現(xiàn)手法等行為來誘導(dǎo)用戶;
2)內(nèi)容與標(biāo)題之間存在嚴(yán)重不實或者原意扭曲;
3)使用夸張標(biāo)題,內(nèi)容與標(biāo)題嚴(yán)重不符的。
8.「飯圈」亂象行為,主要表現(xiàn)為:
1)誘導(dǎo)未成年人應(yīng)援集資、高額消費、投票打榜
2)粉絲互撕謾罵、拉踩引戰(zhàn)、造謠攻擊、人肉搜索、侵犯隱私
3)鼓動「飯圈」粉絲攀比炫富、奢靡享樂等行為
4)以號召粉絲、雇用網(wǎng)絡(luò)水軍、「養(yǎng)號」形式刷量控評等行為
5)通過「蹭熱點」、制造話題等形式干擾輿論,影響傳播秩序
9. 其他危害行為或內(nèi)容,主要表現(xiàn)為:
1)可能引發(fā)未成年人模仿不安全行為和違反社會公德行為、誘導(dǎo)未成年人不良嗜好影響未成年人身心健康的;
2)不當(dāng)評述自然災(zāi)害、重大事故等災(zāi)難的;
3)美化、粉飾侵略戰(zhàn)爭行為的;
4)法律、行政法規(guī)禁止,或可能對網(wǎng)絡(luò)生態(tài)造成不良影響的其他內(nèi)容。
二、違規(guī)處罰
本網(wǎng)站通過主動發(fā)現(xiàn)和接受用戶舉報兩種方式收集違規(guī)行為信息。所有有意的降低內(nèi)容質(zhì)量、傷害平臺氛圍及欺凌未成年人或危害未成年人身心健康的行為都是不能容忍的。
當(dāng)一個用戶發(fā)布違規(guī)內(nèi)容時,本網(wǎng)站將依據(jù)相關(guān)用戶違規(guī)情節(jié)嚴(yán)重程度,對帳號進行禁言 1 天、7 天、15 天直至永久禁言或封停賬號的處罰。當(dāng)涉及欺凌未成年人、危害未成年人身心健康、通過作弊手段注冊、使用帳號,或者濫用多個帳號發(fā)布違規(guī)內(nèi)容時,本網(wǎng)站將加重處罰。
三、申訴
隨著平臺管理經(jīng)驗的不斷豐富,本網(wǎng)站出于維護本網(wǎng)站氛圍和秩序的目的,將不斷完善本公約。
如果本網(wǎng)站用戶對本網(wǎng)站基于本公約規(guī)定做出的處理有異議,可以通過「建議反饋」功能向本網(wǎng)站進行反饋。
(規(guī)則的最終解釋權(quán)歸屬本網(wǎng)站所有)