真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MapReduce原理及實例分析-創(chuàng)新互聯(lián)

前言

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:主機域名、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設、資源網(wǎng)站維護、網(wǎng)站推廣。

由于最近開始涉及MR程序的編寫,之前會一點HIVE,對MR接觸不多,不論從原理還是實際操作上,都有些障礙,終于在今天柳暗花明,將這一過程記錄下,與大家分享~

環(huán)境準備

在VM上搭建好LINUX虛擬機,并安裝配置好HADOOP2.2.0,我這里是單節(jié)點的偽分布式

在eclipse中安裝hadoop插件

對我們這種MR的新手而言,最好在本地有一個HADOOP運行環(huán)境,這樣有許多好處:

如果我們每次寫完MR程序,都打成JAR包上傳至線上服務器上運行,那么每次MR運行的時間非常長,也許等待了許久,運行結果和我們預期不一致,又得改程序重新來一邊,這會有一點痛苦!

在我們本地的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

MapReduce原理及實例分析

如上圖示,大致描述了MAP/REDUCE的運行流程:

  • 輸入文件+InputFormat  提供給MAP

  • 需要清楚提供給MAP的KEY1/VALUE1是什么?MAP準備輸出的KEY2/VALUE2是什么?

  • MAP輸出后,會進行分區(qū)操作,也就是決定KEY2/VALUE2發(fā)到哪些reduce上

  • 分區(qū)由job.setPartitionerClass決定

  • 在同一個分區(qū)內(nèi),會對KEY2進行排序,依據(jù)是job.setSortComparatorClass,

    如果沒有設置則根據(jù)KEY的compareTo方法

  • 接下來進入分組階段,會構造KEY3和VALUE迭代器

  • 分組的依據(jù)是job.setGroupingComparatorClass,只要比較器比較的相同就在同一組

  • KEY3/VALUE迭代器交給reduce方法處理

步驟:

  • 自定義KEY

KEY應該是可序列化,可比較的,只需要注意實現(xiàn)WritableComparable即可。

重點關注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ū)

分區(qū),是KEY的第一次比較,extends Partitioner 并提供getPartition即可。

這里根據(jù)cate分區(qū)。

  • 分組

需要注意的是,分組類必須提供構造方法,并且重載

public int compare(WritableComparable w1, WritableComparable w2) 。這里根據(jù)cate,spu分組。

通過上述的,就可以取得分cate分spu的SUM(counts)值了。

通過eclipse hadoop插件,可以方便我們上傳測試文件到HDFS,可以瀏覽,刪除HDFS文件,更加方便的是,就像運行普通JAVA程序一樣的運行/調(diào)試MR程序(不在需要打成JAR包),讓我們可以追蹤MR的每一步,非常方便進行邏輯性測試~

MapReduce原理及實例分析

那么怎么取分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 values,
Reducer.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...");
}

MapReduce原理及實例分析

那么到現(xiàn)在,分組取TOP就完成了。

一個疑問:reduce階段中的KEY到底是什么?

在上面例子中的取TOP3的MR中,我們是以cate+counts為KEY,spu為VALUE。

cate作為分區(qū),分組的依據(jù),排序根據(jù)同一個cate下counts倒序。如下圖所示:

MapReduce原理及實例分析

那么reduce方法中的KEY是什么?

spu1,spu4,spu3...是VALUES中的,那么這個迭代器的對應KEY是什么呢?

是cate+42嗎?還是其他?

在VALUES迭代過程中,這個KEY會變化嗎?

我們可以看下ECLIPSE中的控制臺打印輸出的內(nèi)容:

MapReduce原理及實例分析

從打印上來看,可以分析出如下結論:

分組后,交給reduce方法處理的KEY是同一組的所有KEY的第一個KEY,并且在VALUES迭代過程中,KEY并不會重新NEW,而是利用SETTER反射的方式重新設置屬性值,這樣在VALUES迭代過程中取得的KEY都是與之對應的KEY了。

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


網(wǎng)站名稱:MapReduce原理及實例分析-創(chuàng)新互聯(lián)
URL標題:http://weahome.cn/article/cseegj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部