前言
成都創(chuàng)新互聯(lián)公司長期為上千家客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為臨桂企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站制作,臨桂網(wǎng)站改版等技術(shù)服務。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
由于最近開始涉及MR程序的編寫,之前會一點HIVE,對MR接觸不多,不論從原理還是實際操作上,都有些障礙,終于在今天柳暗花明,將這一過程記錄下,與大家分享~
環(huán)境準備
在VM上搭建好LINUX虛擬機,并安裝配置好HADOOP2.2.0,我這里是單節(jié)點的偽分布式 在eclipse中安裝hadoop插件 對我們這種MR的新手而言,最好在本地有一個HADOOP運行環(huán)境,這樣有許多好處: 如果我們每次寫完MR程序,都打成JAR包上傳至線上服務器上運行,那么每次MR運行的時間非常長,也許等待了許久,運行結(jié)果和我們預期不一致,又得改程序重新來一邊,這會有一點痛苦! 在我們本地的HADOOP上運行MR程序非???,就那么幾秒,更加重要的是,我們可以再 本地準備輸入文件去測試MR的邏輯,這對調(diào)試/開發(fā)程序非常方便! |
實例及原理分析
假設,我們有這樣的輸入文件: cate-a spu-1 1 cate-a spu-1 2 cate-a spu-2 3 cate-a spu-2 4 cate-a spu-3 5 cate-a spu-3 6 cate-a spu-1 7 cate-a spu-4 8 cate-a spu-4 9 cate-a spu-1 8 ... 我們希望得到分cate,分spu的總和,并且取分cate分spu的TOP3 如上圖示,大致描述了MAP/REDUCE的運行流程:
步驟:
KEY應該是可序列化,可比較的,只需要注意實現(xiàn)WritableComparable即可。 重點關(guān)注compareTo方法。 @Override public int compareTo(Cate2SpuKey that) { System.out.println("開始對KEY進行排序..."); if(cate2.equals(that.getCate2())){ return spu.compareTo(that.getSpu()); } return cate2.compareTo(that.getCate2()); }
分區(qū),是KEY的第一次比較,extends Partitioner 并提供getPartition即可。 這里根據(jù)cate分區(qū)。
需要注意的是,分組類必須提供構(gòu)造方法,并且重載 public int compare(WritableComparable w1, WritableComparable w2) 。這里根據(jù)cate,spu分組。 通過上述的,就可以取得分cate分spu的SUM(counts)值了。 通過eclipse hadoop插件,可以方便我們上傳測試文件到HDFS,可以瀏覽,刪除HDFS文件,更加方便的是,就像運行普通JAVA程序一樣的運行/調(diào)試MR程序(不在需要打成JAR包),讓我們可以追蹤MR的每一步,非常方便進行邏輯性測試~ 那么怎么取分cate分spu的TOP3呢? 我們只需要把上一個MR的輸出文件,作為另一個MR的輸入,并且以cate+counts 為KEY ,以spu為VALUE,根據(jù)cate分區(qū),分組,排序的話:cate相同情況下,根據(jù)counts倒序; 最后在reduce階段取TOP3即可。 @Override protected void reduce(Cate2CountsKey key, Iterable<Text> values, Reducer<Cate2CountsKey, Text, Text, Text>.Context context) throws IOException, InterruptedException { System.out.println("reduce..."); System.out.println("VALUES迭代前... key:" + key.toString()); System.out.println("VALUES迭代前... key:" + key.getCounts()); int top = 3; for(Text t : values){ if(top > 0){ System.out.println("VALUES迭代中... key:" + key.toString()); System.out.println("VALUES迭代中... key:" + key.getCounts()); context.write(new Text(key.getCate2() + "\t" + t.toString()), new Text(key.getCounts() + "")); top--; } } System.out.println("reduce over..."); } 那么到現(xiàn)在,分組取TOP就完成了。 |
一個疑問:reduce階段中的KEY到底是什么?
在上面例子中的取TOP3的MR中,我們是以cate+counts為KEY,spu為VALUE。 cate作為分區(qū),分組的依據(jù),排序根據(jù)同一個cate下counts倒序。如下圖所示: 那么reduce方法中的KEY是什么? spu1,spu4,spu3...是VALUES中的,那么這個迭代器的對應KEY是什么呢? 是cate+42嗎?還是其他? 在VALUES迭代過程中,這個KEY會變化嗎? 我們可以看下ECLIPSE中的控制臺打印輸出的內(nèi)容: 從打印上來看,可以分析出如下結(jié)論: 分組后,交給reduce方法處理的KEY是同一組的所有KEY的第一個KEY,并且在VALUES迭代過程中,KEY并不會重新NEW,而是利用SETTER反射的方式重新設置屬性值,這樣在VALUES迭代過程中取得的KEY都是與之對應的KEY了。 |
分享標題:MapReduce原理及實例分析
文章URL:http://muchs.cn/article10/ghesgo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供自適應網(wǎng)站、全網(wǎng)營銷推廣、ChatGPT、品牌網(wǎng)站建設、網(wǎng)站制作、App設計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)