1) 在Reduce階段進(jìn)行Join,這樣運(yùn)算量比較小.(這個(gè)適合被Join的數(shù)據(jù)比較小的情況下.)
2) 壓縮字段,對(duì)數(shù)據(jù)預(yù)處理,過(guò)濾不需要的字段.
3) 最后一步就是在Mapper階段過(guò)濾,這個(gè)就是Bloom Filter的用武之地了.也就是需要詳細(xì)說(shuō)明的地方.
下面就拿一個(gè)我們大家都熟悉的場(chǎng)景來(lái)說(shuō)明這個(gè)問(wèn)題: 找出上個(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 階段,通過(guò)動(dòng)感地帶號(hào)碼來(lái)過(guò)濾. 優(yōu)點(diǎn):這樣需要處理的數(shù)據(jù)相對(duì)比較少,這個(gè)也是比較常用的方法.
缺點(diǎn):很多數(shù)據(jù)在Mapper階段花了老鼻子力氣匯總了,還通過(guò)網(wǎng)絡(luò)Shuffle到Reduce節(jié)點(diǎn),結(jié)果到這個(gè)階段給過(guò)濾了.
2)在 Mapper 階段時(shí),通過(guò)動(dòng)感地帶號(hào)碼來(lái)過(guò)濾數(shù)據(jù). 優(yōu)點(diǎn):這樣可以過(guò)濾很多不是動(dòng)感地帶的數(shù)據(jù),比如神州行,全球通.這些過(guò)濾的數(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è)問(wèn)題的)
Bloom Filter就是用來(lái)解決上面方法2的缺點(diǎn)的.
方法2的缺點(diǎn)就是大量的數(shù)據(jù)需要在多個(gè)節(jié)點(diǎn)復(fù)制.Bloom Filter通過(guò)多個(gè)Hash算法, 把這個(gè)號(hào)碼列表壓縮到了一個(gè)Bitmap里面. 通過(guò)允許一定的錯(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)景中,這根本不是問(wèn)題.因?yàn)檫@個(gè)算法只是過(guò)濾一些號(hào)碼,漏網(wǎng)之魚(yú)會(huì)在Reduce階段進(jìn)行精確匹配時(shí)顧慮掉.
這個(gè)方法改進(jìn)之后基本上完全回避了方法2的缺點(diǎn):
1) 沒(méi)有大量的動(dòng)感地帶號(hào)碼發(fā)送到所有的Mapper節(jié)點(diǎn).
2) 很多非動(dòng)感地帶號(hào)碼在Mapper階段就過(guò)濾了(雖然不是100%),避免了網(wǎng)絡(luò)帶寬的開(kāi)銷及延時(shí).
繼續(xù)需要學(xué)習(xí)的地方:Bitmap的大小, Hash函數(shù)的多少, 以及存儲(chǔ)的數(shù)據(jù)的多少. 這3個(gè)變量如何取值才能才能在存儲(chǔ)空間與錯(cuò)誤率之間取得一個(gè)平衡.