搭好了Hadoop環(huán)境,編寫了個(gè)簡單的WordCount程序,接下來,寫幾個(gè)MapReduce程序,看看MapReduce編程究竟怎么個(gè)用法
案例1 廣告數(shù)據(jù)統(tǒng)計(jì)
數(shù)據(jù)格式:
11 xiaoming 1 20171224
11 xiaofang 1 20171224
11 xiaofang 2 20171224
11 xiaoshan 1 20171224
11 xiaoli 1 20171224
12 zhangsan 1 20171224
12 lisi 1 20171224
31 wangwu 1 20171224
31 mazi 1 20171224
12 daming 1 20171224
11 xiaoming 1 20171224
11 xiaofang 1 20171224
11 xiaofang 2 20171224
11 xiaoshan 1 20171224
11 xiaoli 1 20171224
12 zhangsan 1 20171224
12 wangwang 1 20171224
31 xuebing 1 20171224
地域編碼+用戶編號+瀏覽類型+日期
名詞解釋:
- 廣告曝光量:廣告被瀏覽的次數(shù)(PV即Page View)
- 廣告點(diǎn)擊量:廣告被點(diǎn)擊的次數(shù),常用click表示
- 廣告點(diǎn)擊率:廣告點(diǎn)擊量/廣告曝光量
需求一:按天統(tǒng)計(jì)曝光量,按照曝光量升序和降序排列
- 簡單分析:需要實(shí)現(xiàn)兩個(gè)作業(yè):統(tǒng)計(jì)曝光量、排序
- 其中排序需依賴統(tǒng)計(jì)結(jié)果,升序可直接依賴MapReduce框架的Shuffle進(jìn)行,降序需要重寫比較器
代碼就不直接粘貼了,具體看github代碼,本例類為com.nanri.mapr01.AdStat - 編譯,打包,上傳到集群,使用命令運(yùn)行就不多作介紹,與wordcount類似
需求二:對前一天產(chǎn)生的數(shù)據(jù)按地區(qū)統(tǒng)計(jì)曝光量、點(diǎn)擊量、點(diǎn)擊率
- 簡單分析:本需求需要實(shí)現(xiàn)統(tǒng)計(jì)多個(gè)變量,可以自定義一個(gè)實(shí)體類來存放這些變量,此為本例的練習(xí)點(diǎn),代碼見上述github,本例類為com.nari.adstat.MrPvClickByAreaDayApp
需求三:一批評分?jǐn)?shù)據(jù),數(shù)據(jù)樣本如下
xiaoming 18 female 50
姓名 + 年齡 + 性別 + 評分
- 需求:找出不同性別不同年齡段用戶對某個(gè)產(chǎn)品的最高打分
- 簡單分析:本例練習(xí)點(diǎn)為自定義partition,用性別作為key,只會分為兩個(gè)reduce執(zhí)行,不符合要求,自定義partition,再按照年齡進(jìn)行分區(qū),這樣每個(gè)年齡段的不同性別分為不同的reduce分別計(jì)算,滿足要求
- 本例為com.nari.adstat.partition.ScoreStatByAgeGenderApp
在MapReduce執(zhí)行也可以設(shè)置一些參數(shù)來優(yōu)化任務(wù)效果
- Map Task重試次數(shù)
mapreduce.map.maxattempts - Reduce Task重試次數(shù)
mapreduce.reduce.maxattempts - 是否打開Map階段的推測執(zhí)行機(jī)制,默認(rèn)為True
mapreduce.map.speculative - 是否打開Reduce階段的推測執(zhí)行機(jī)制,默認(rèn)為True
mapreduce.reduce.speculative - 調(diào)整一個(gè)分片的最小數(shù)據(jù)量
mapreduce.input.fileinputformat.split.minsize