posts - 82, comments - 269, trackbacks - 0, articles - 1
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

           

          Hadoop的幾種Join方法

          1)      Reduce階段進(jìn)行Join,這樣運(yùn)算量比較小.(這個(gè)適合被Join的數(shù)據(jù)比較小的情況下.)

          2)      壓縮字段,對(duì)數(shù)據(jù)預(yù)處理,過濾不需要的字段.

          3)      最后一步就是在Mapper階段過濾,這個(gè)就是Bloom Filter的用武之地了.也就是需要詳細(xì)說(shuō)明的地方.

           

          下面就拿一個(gè)我們大家都熟悉的場(chǎng)景來(lái)說(shuō)明這個(gè)問題: 找出上個(gè)月動(dòng)感地帶的客戶資費(fèi)的使用情況,包括接入和撥出.

          (這個(gè)只是我臆想出來(lái)的例子,根據(jù)實(shí)際的DB數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),在這個(gè)場(chǎng)景下肯定有更好的解決方案,大家不要太較真哦)

          這個(gè)時(shí)候的兩個(gè)個(gè)數(shù)據(jù)集都是比較大的,這兩個(gè)數(shù)據(jù)集分別是:上個(gè)月的通話記錄,動(dòng)感地帶的手機(jī)號(hào)碼列表.

           

          比較直接的處理方法有2:

          1) Reduce 階段,通過動(dòng)感地帶號(hào)碼來(lái)過濾.

                          優(yōu)點(diǎn):這樣需要處理的數(shù)據(jù)相對(duì)比較少,這個(gè)也是比較常用的方法.

                          缺點(diǎn):很多數(shù)據(jù)在Mapper階段花了老鼻子力氣匯總了,還通過網(wǎng)絡(luò)ShuffleReduce節(jié)點(diǎn),結(jié)果到這個(gè)階段給過濾了.

           

          2) Mapper 階段時(shí),通過動(dòng)感地帶號(hào)碼來(lái)過濾數(shù)據(jù).

                          優(yōu)點(diǎn):這樣可以過濾很多不是動(dòng)感地帶的數(shù)據(jù),比如神州行,全球通.這些過濾的數(shù)據(jù)就可以節(jié)省很多網(wǎng)絡(luò)帶寬了.

                          缺點(diǎn):就是動(dòng)感地帶的號(hào)碼不是小數(shù)目,如果這樣處理就需要把這個(gè)大塊頭復(fù)制到所有的Mapper節(jié)點(diǎn),甚至是Distributed Cache.(Bloom Filter就是用來(lái)解決這個(gè)問題的)

           

           

          Bloom Filter就是用來(lái)解決上面方法2的缺點(diǎn)的.

          方法2的缺點(diǎn)就是大量的數(shù)據(jù)需要在多個(gè)節(jié)點(diǎn)復(fù)制.Bloom Filter通過多個(gè)Hash算法, 把這個(gè)號(hào)碼列表壓縮到了一個(gè)Bitmap里面. 通過允許一定的錯(cuò)誤率來(lái)?yè)Q空間, 這個(gè)和我們平時(shí)經(jīng)常提到的時(shí)間和空間的互換類似.詳細(xì)情況可以參考:

          http://blog.csdn.net/jiaomeng/article/details/1495500

          但是這個(gè)算法也是有缺陷的,就是會(huì)把很多神州行,全球通之類的號(hào)碼當(dāng)成動(dòng)感地帶.但在這個(gè)場(chǎng)景中,這根本不是問題.因?yàn)檫@個(gè)算法只是過濾一些號(hào)碼,漏網(wǎng)之魚會(huì)在Reduce階段進(jìn)行精確匹配時(shí)顧慮掉.

          這個(gè)方法改進(jìn)之后基本上完全回避了方法2的缺點(diǎn):

          1)      沒有大量的動(dòng)感地帶號(hào)碼發(fā)送到所有的Mapper節(jié)點(diǎn).

          2)      很多非動(dòng)感地帶號(hào)碼在Mapper階段就過濾了(雖然不是100%),避免了網(wǎng)絡(luò)帶寬的開銷及延時(shí).

           

          繼續(xù)需要學(xué)習(xí)的地方:Bitmap的大小, Hash函數(shù)的多少, 以及存儲(chǔ)的數(shù)據(jù)的多少. 3個(gè)變量如何取值才能才能在存儲(chǔ)空間與錯(cuò)誤率之間取得一個(gè)平衡.


           


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 酉阳| 保德县| 东台市| 临漳县| 靖江市| 林州市| 怀柔区| 吐鲁番市| 东乡族自治县| 青阳县| 睢宁县| 唐海县| 康马县| 舞钢市| 大庆市| 临夏县| 富民县| 衢州市| 石阡县| 历史| 佛山市| 济阳县| 清原| 巴林左旗| 贵州省| 白沙| 巩留县| 黄山市| 浦东新区| 涟源市| 柏乡县| 方山县| 沭阳县| 青阳县| 乾安县| 黑山县| 新竹县| 陕西省| 潮安县| 寿宁县| 杭锦旗|