一、背景
當(dāng)采用隨機(jī)數(shù)和擴(kuò)容表進(jìn)行join解決數(shù)據(jù)傾斜的時(shí)候,就代表著,你的之前的數(shù)據(jù)傾斜的解決方案,都沒法使用。
這個(gè)方案是沒辦法徹底解決數(shù)據(jù)傾斜的,更多的,是一種對(duì)數(shù)據(jù)傾斜的緩解。
原理,其實(shí)在上一講,已經(jīng)帶出來了。
擴(kuò)容表(RDD)
步驟:
1、選擇一個(gè)RDD,要用flatMap,進(jìn)行擴(kuò)容,將每條數(shù)據(jù),映射為多條數(shù)據(jù),每個(gè)映射出來的數(shù)據(jù),都帶了一個(gè)n以內(nèi)的隨機(jī)數(shù),通常來說,會(huì)選擇10。
2、將另外一個(gè)RDD,做普通的map映射操作,每條數(shù)據(jù),都打上一個(gè)10以內(nèi)的隨機(jī)數(shù)。
3、最后,將兩個(gè)處理后的RDD,進(jìn)行join操作。
[圖片上傳中...(image.png-10463b-1548409148513-0)]
二、流程圖解

局限性:
1、因?yàn)槟愕膬蓚€(gè)RDD都很大,所以你沒有辦法去將某一個(gè)RDD擴(kuò)的特別大,一般咱們就是10倍。
2、如果就是10倍的話,那么數(shù)據(jù)傾斜問題,的確是只能說是緩解和減輕,不能說徹底解決。
sample采樣傾斜key并單獨(dú)進(jìn)行join
3、將key,從另外一個(gè)RDD中過濾出的數(shù)據(jù),可能只有一條,或者幾條,此時(shí),咱們可以任意進(jìn)行擴(kuò)容,擴(kuò)成1000倍。
4、將從第一個(gè)RDD中拆分出來的那個(gè)傾斜key RDD,打上1000以內(nèi)的一個(gè)隨機(jī)數(shù)。
5、這種情況下,還可以配合上,提升shuffle reduce并行度,join(rdd, 1000)。通常情況下,效果還是非常不錯(cuò)的。
6、打散成100份,甚至1000份,2000份,去進(jìn)行join,那么就肯定沒有數(shù)據(jù)傾斜的問題了吧。
三、總結(jié)
1、完整的大數(shù)據(jù)項(xiàng)目開發(fā)流程:數(shù)據(jù)分析、需求分析、技術(shù)方案設(shè)計(jì)、數(shù)據(jù)表設(shè)計(jì)、代碼編寫、功能測(cè)試、性能調(diào)優(yōu)、(上線)troubleshooting、(上線)解決數(shù)據(jù)傾斜問題。
2、交互式大數(shù)據(jù)分析系統(tǒng)的架構(gòu):J2EE+Spark;
3、基礎(chǔ)組件:企業(yè)級(jí)大數(shù)據(jù)項(xiàng)目,spark工程,架構(gòu)
4、復(fù)雜的用戶分析的業(yè)務(wù):聚合統(tǒng)計(jì)、按時(shí)間比例隨機(jī)抽取、復(fù)雜排序、取topn、用戶行為分析
5、spark的各種算子:map、reduce、join、group
6、spark的高級(jí)技術(shù)點(diǎn):自定義Accumulator、隨機(jī)抽取算法、二次排序、分組取TopN
7、性能調(diào)優(yōu):普通調(diào)優(yōu)、jvm調(diào)優(yōu)、shuffle調(diào)優(yōu)、算子調(diào)優(yōu)
8、troubleshooting:多個(gè)實(shí)際生產(chǎn)環(huán)境中的,線上復(fù)雜報(bào)錯(cuò)問題的,剖析和解決方案
9、(高端)全套的數(shù)據(jù)傾斜解決方案:原理+現(xiàn)象+定位、7種解決方案