作者: 永洪BI??來源: 永洪科技??時間:2020年01月07日
我們知道數(shù)據(jù)分析的第一步是準(zhǔn)備數(shù)據(jù),所以在前面的課程里,我們介紹了元數(shù)據(jù)(Yonghong BI課程系列之概念:元數(shù)據(jù)),今天這篇文章,主要介紹大數(shù)據(jù)量組合數(shù)據(jù)集在永洪中的應(yīng)用實例:Mapsidejoin。
什么是Mapsidejoin?按照字面意思,Mapsidejoin就是M—節(jié)點—組合 。在了解Mapsidejoin之前,首先我們要了解一下MapReduce模型以及產(chǎn)品的四個節(jié)點CNMR的作用,通過MapReduce模型中,Mapsidejoin和Reducesidejoin的對比,了解在大數(shù)據(jù)量數(shù)據(jù)集進行組合時,Mapsidejoin的優(yōu)點。
Client Node —C節(jié)點是客戶端訪問節(jié)點,客戶通過訪問C節(jié)點來提交任務(wù)。
Naming Node —N節(jié)點相當(dāng)于集群的大腦,除了監(jiān)控集群其他節(jié)點外,還要收集客戶通過C節(jié)點提交的任務(wù)進行分配等等。
Map Node — M節(jié)點是存儲數(shù)據(jù)文件的節(jié)點
Reduce Node —R節(jié)點是用來做匯總計算的計算
百度百科對MapReduce的定義感覺還是比較全面的,簡單的概括一下:MapReduce是一個基于集群的計算平臺,是一個簡化分布式編程的計算框架,是一個將分布式計算抽象為Map和Reduce兩個階段的編程模型。而Yonghong在進行組合數(shù)據(jù)集計算時用到的就是MapReduce模型。
適用場景:多M節(jié)點的分布式集群,大數(shù)據(jù)量數(shù)據(jù)的組合包括大表join小表,大表join大表。
在MapReduce模型中,對于組合計算可以分為Map-side-join 和Reduce-side-join兩種,下面用一個例子簡單介紹一下:
假設(shè)我們有兩張表:表1人員表為大表,表2地區(qū)表為小表,如下圖所示:
我們想通過id把表1的name和表2的Address連接起來 ,那么就需要以id為連接列,做inner join, 連接對應(yīng)的id為id=1,id=2,id=3,id=4。
假如現(xiàn)在我們的集群里面有Map1和Map2兩個Map節(jié)點,那么當(dāng)我們將表1和表2入集市以后,經(jīng)過數(shù)據(jù)的拆分存儲,我們可能會出現(xiàn)以下情況:
? 情況1:可以進行Mapsidejoin
如上圖所示,經(jīng)過拆分后的表1和表2,連接列id=1-4 對應(yīng)的數(shù)據(jù)存放在了同一個節(jié)點,在join時,Map節(jié)點會檢測連接列數(shù)據(jù)是否已經(jīng)完成對應(yīng),如果此時數(shù)據(jù)對應(yīng)后就可以在Map節(jié)點上進行join,Map節(jié)點將join后的結(jié)果發(fā)送給Reduce節(jié)點,Reduce節(jié)點將結(jié)果進行匯總計算就可以了。
? 情況2:不能進行Mapsidejoin時會進行Reducesidejoin
上圖所示, 經(jīng)過拆分存儲后的數(shù)據(jù)顯示表1的id1,2存放在了Map1節(jié)點;而表2的id1,2 存放在了Map2 節(jié)點上面;這個時候在join時Map節(jié)點檢測到對應(yīng)的數(shù)據(jù)不在同一個節(jié)點上,就會將所有的數(shù)據(jù)拿到Reduce節(jié)點重新進行全量的join。
以上兩種情況簡單的說明了Mapsidejoin 和 Reducesidejoin。
Map端join的好處是可以提前過濾掉join中需要排除的大量數(shù)據(jù),會減少數(shù)據(jù)的傳輸,因此Mapsidejoin 適用于大數(shù)據(jù)量join的場景。
Reduce端做join優(yōu)點是比較靈活,缺點是需要做大量數(shù)據(jù)傳輸和整個join過程都比較耗時,因此Reducesidejoin適用于小數(shù)據(jù)量的場景。
此外, 由于當(dāng)數(shù)據(jù)量巨大時,做join是非常消耗資源的,對于非Mapsidejoin的形式,無論是直連數(shù)據(jù)庫壓到數(shù)據(jù)庫做join,還是數(shù)據(jù)集市的形式去做Reducesidejoin,都會對節(jié)點造成極大壓力,容易造成產(chǎn)品很卡的情況,再嚴重就會造成OOM,宕機等。所以我們需要使用Mapsidejoin來規(guī)避這種場景, 當(dāng)數(shù)據(jù)量大的時候,我們可以部署多個M節(jié)點,通過將數(shù)據(jù)先導(dǎo)入集市,存放在集群中的多個M節(jié)點,然后在M節(jié)點上面進行計算來實現(xiàn)Mapsidejoin,這樣能把C,R節(jié)點的壓力平均分到M節(jié)點上面,解決大數(shù)據(jù)量join可能帶來的使用壓力,讓資源的利用更加高效。
那么我們怎么實現(xiàn)Mapsidejoin呢 ?如何保證數(shù)據(jù)經(jīng)過拆分后,連接列對應(yīng)的數(shù)據(jù)一定存放在同一個Map節(jié)點上面呢?下面介紹永洪Mapsidejoin的兩種實現(xiàn)方式。
事實表——維度表
適用場景(大表join小表)
在分布式系統(tǒng)中,當(dāng)有星形數(shù)據(jù)(一個大表,若干個小表)需要join的時候,可以將小表的數(shù)據(jù)復(fù)制到每個Map節(jié)點,執(zhí)行Mapsidejoin, 而無須到Reduce節(jié)點進行連接操作,從而提升表連接的效率。
在MPP集市中,我們將大表以普通的增量導(dǎo)入形式入集市,將所有小表在增量導(dǎo)入時勾選維度表的形式,如下圖所示:
此時勾選維度表的小表會全量生成在每一個Map節(jié)點。
以上面表1人員表,表2地區(qū)表的為例:表1增量導(dǎo)入正常拆分,表2以增量導(dǎo)入維度表形式入集市。
如圖所示,此時在每一個M節(jié)點上,因為表2全量存儲,所以表1和表2對應(yīng)的id數(shù)據(jù)就一定能在同一個M節(jié)點找到。
但是事實表——維度表的形式也有局限性,比如兩個以上的大表做join時,就需要將其中的一個或多個大表,存放到每一個M節(jié)點上,大數(shù)據(jù)量的大表進行維度表存儲本來就會加大資源消耗,而且大表作為維度表,無法壓到內(nèi)存中進行計算,因此無法使用Mapsidejoin。
所以針對這種情況,我們采取分片列來支持大表join大表的使用場景。
分片列
適用場景(大表join大表)
在8.5.1版本之前,我們只能用維度表join事實表的形式去做Mapsidejoin,在一些用戶場景中,無法提前進行數(shù)據(jù)表關(guān)聯(lián)做成寬表模型入集市,同時也不滿足Mapsidejoin(或broadcast join)計算的要求,因此需要在集市中做分布式j(luò)oin的計算支持。
具體場景有:
1)業(yè)務(wù)上需要,比如:部分匯總后再進行關(guān)聯(lián),某時間段內(nèi)產(chǎn)品銷售額大于特定值時的產(chǎn)品報修批次分布;特定值進行關(guān)聯(lián),選擇某個時間段里面最后出現(xiàn)的數(shù)據(jù)和另外的表關(guān)聯(lián);自關(guān)聯(lián),本月數(shù)據(jù)和上月數(shù)據(jù)關(guān)聯(lián)計算等等;這些場景下(一般是雪花模型或更復(fù)雜)如果提前join會導(dǎo)致數(shù)據(jù)膨脹,從而產(chǎn)生非常多的冗余數(shù)據(jù),但實際使用時因為有過濾條件則不會產(chǎn)生太多數(shù)據(jù);
2)數(shù)據(jù)量較大的事實表需要頻繁增量更新,且全量數(shù)據(jù)join成寬表入集市的時間開銷太大;
3)自服務(wù)場景下,是否要關(guān)聯(lián)表,以及關(guān)聯(lián)什么字段存在不確定性,需要保留原始細節(jié)表來進行自助查詢。
分片列的Mapsidejoin實現(xiàn)邏輯其實和上面情況1的圖片類似。
我們通過增量導(dǎo)入分片列的形式將表1和表2的關(guān)聯(lián)列使用hash算法,保證兩張表的id對應(yīng)的數(shù)據(jù)經(jīng)過拆分后一定會存儲在同一個Map節(jié)點上面,這樣經(jīng)過拆分的大表就可以壓到內(nèi)存中計算。
1、將需要組合的大表以增量導(dǎo)入的形式入集市,同時需要勾選分片列屬性,選擇分片列為鏈接列。比如表1在增量導(dǎo)入集市時要勾選分片列為id ,表2也需要同樣的操作。
2、將生成的數(shù)據(jù)集市數(shù)據(jù)集進行組合,Map節(jié)點在檢測數(shù)據(jù)時會自動使用Mapsidejoin形式連接。
一定要記住使用Mapsidejoin的前提是分布式集群多M節(jié)點且大數(shù)據(jù)量數(shù)據(jù)集市的數(shù)據(jù)集做join。
最后我們用一張圖片來簡單的回顧一下Mapsidejoin的兩種形式。
大表jion大表用分片列
大表join小表用事實表——維度表
?