|
目錄 正文 MapReduce是什么
首先讓我們來(lái)重溫一下 hadoop 的四大組件:
HDFS:分布式存儲(chǔ)系統(tǒng)
MapReduce:分布式計(jì)算系統(tǒng)
YARN:hadoop 的資源調(diào)度系統(tǒng)
Common:以上三大組件的底層支撐組件,主要提供基礎(chǔ)工具包和 RPC 框架等
MapReduce 是一個(gè)分布式運(yùn)算程序的編程框架,是用戶開(kāi)發(fā)“基于 Hadoop 的數(shù)據(jù)分析應(yīng)用” 的核心框架
MapReduce 核心功能是將用戶編寫的業(yè)務(wù)邏輯代碼和自帶默認(rèn)組件整合成一個(gè)完整的分布 式運(yùn)算程序,并發(fā)運(yùn)行在一個(gè) Hadoop 集群上
為什么需要 MapReduce
1、海量數(shù)據(jù)在單機(jī)上處理因?yàn)橛布Y源限制,無(wú)法勝任
2、而一旦將單機(jī)版程序擴(kuò)展到集群來(lái)分布式運(yùn)行,將極大增加程序的復(fù)雜度和開(kāi)發(fā)難度
3、引入 MapReduce 框架后,開(kāi)發(fā)人員可以將絕大部分工作集中在業(yè)務(wù)邏輯的開(kāi)發(fā)上,而將 分布式計(jì)算中的復(fù)雜性交由框架來(lái)處理
設(shè)想一個(gè)海量數(shù)據(jù)場(chǎng)景下的數(shù)據(jù)計(jì)算需求:
| 單機(jī)版:磁盤受限,內(nèi)存受限,計(jì)算能力受限 |
|
分布式版:
1、 數(shù)據(jù)存儲(chǔ)的問(wèn)題,hadoop 提供了 hdfs 解決了數(shù)據(jù)存儲(chǔ)這個(gè)問(wèn)題
2、 運(yùn)算邏輯至少要分為兩個(gè)階段,先并發(fā)計(jì)算(map),然后匯總(reduce)結(jié)果
3、 這兩個(gè)階段的計(jì)算如何啟動(dòng)?如何協(xié)調(diào)?
4、 運(yùn)算程序到底怎么執(zhí)行?數(shù)據(jù)找程序還是程序找數(shù)據(jù)?
5、 如何分配兩個(gè)階段的多個(gè)運(yùn)算任務(wù)?
6、 如何管理任務(wù)的執(zhí)行過(guò)程中間狀態(tài),如何容錯(cuò)?
7、 如何監(jiān)控?
8、 出錯(cuò)如何處理?拋異常?重試?
|
可見(jiàn)在程序由單機(jī)版擴(kuò)成分布式版時(shí),會(huì)引入大量的復(fù)雜工作。為了提高開(kāi)發(fā)效率,可以將 分布式程序中的公共功能封裝成框架,讓開(kāi)發(fā)人員可以將精力集中于業(yè)務(wù)邏輯。
Hadoop 當(dāng)中的 MapReduce 就是這樣的一個(gè)分布式程序運(yùn)算框架,它把大量分布式程序都會(huì) 涉及的到的內(nèi)容都封裝進(jìn)了,讓用戶只用專注自己的業(yè)務(wù)邏輯代碼的開(kāi)發(fā)。它對(duì)應(yīng)以上問(wèn)題 的整體結(jié)構(gòu)如下:
MRAppMaster:MapReduce Application Master,分配任務(wù),協(xié)調(diào)任務(wù)的運(yùn)行
MapTask:階段并發(fā)任,負(fù)責(zé) mapper 階段的任務(wù)處理 YARNChild
ReduceTask:階段匯總?cè)蝿?wù),負(fù)責(zé) reducer 階段的任務(wù)處理 YARNChild
MapReduce做什么

簡(jiǎn)單地講,MapReduce可以做大數(shù)據(jù)處理。所謂大數(shù)據(jù)處理,即以價(jià)值為導(dǎo)向,對(duì)大數(shù)據(jù)加工、挖掘和優(yōu)化等各種處理。
MapReduce擅長(zhǎng)處理大數(shù)據(jù),它為什么具有這種能力呢?這可由MapReduce的設(shè)計(jì)思想發(fā)覺(jué)。MapReduce的思想就是“分而治之”。
?。?)Mapper負(fù)責(zé)“分”,即把復(fù)雜的任務(wù)分解為若干個(gè)“簡(jiǎn)單的任務(wù)”來(lái)處理。“簡(jiǎn)單的任務(wù)”包含三層含義:一是數(shù)據(jù)或計(jì)算的規(guī)模相對(duì)原任務(wù)要大大縮??;二是就近計(jì)算原則,即任務(wù)會(huì)分配到存放著所需數(shù)據(jù)的節(jié)點(diǎn)上進(jìn)行計(jì)算;三是這些小任務(wù)可以并行計(jì)算,彼此間幾乎沒(méi)有依賴關(guān)系。
?。?)Reducer負(fù)責(zé)對(duì)map階段的結(jié)果進(jìn)行匯總。至于需要多少個(gè)Reducer,用戶可以根據(jù)具體問(wèn)題,通過(guò)在mapred-site.xml配置文件里設(shè)置參數(shù)mapred.reduce.tasks的值,缺省值為1。
MapReduce 程序運(yùn)行演示
在 MapReduce 組件里,官方給我們提供了一些樣例程序,其中非常有名的就是 wordcount 和 pi 程序。這些 MapReduce 程序的代碼都在 hadoop-mapreduce-examples-2.7.5.jar 包里,這 個(gè) jar 包在 hadoop 安裝目錄下的/share/hadoop/mapreduce/目錄里 下面我們使用 hadoop 命令來(lái)試跑例子程序,看看運(yùn)行效果
MapReduce 示例 pi 的程序
[hadoop@hadoop1 ~]$ cd apps/hadoop-2.7.5/share/hadoop/mapreduce/
[hadoop@hadoop1 mapreduce]$ pwd
/home/hadoop/apps/hadoop-2.7.5/share/hadoop/mapreduce
[hadoop@hadoop1 mapreduce]$ hadoop jar hadoop-mapreduce-examples-2.7.5.jar pi 5 5

MapReduce 示例 wordcount 的程序
[hadoop@hadoop1 mapreduce]$ hadoop jar hadoop-mapreduce-examples-2.7.5.jar wordcount /wc/input1/ /wc/output1/

查看結(jié)果
[hadoop@hadoop1 mapreduce]$ hadoop fs -cat /wc/output1/part-r-00000

其他程序
那除了這兩個(gè)程序以外,還有沒(méi)有官方提供的其他程序呢,還有就是它們的源碼在哪里呢?
我們打開(kāi) mapreduce 的源碼工程,里面有一個(gè) hadoop-mapreduce-project 項(xiàng)目:

里面有一個(gè)例子程序的子項(xiàng)目:hadoop-mapreduce-examples

其中 src 是例子程序源碼目錄,pom.xml 是該項(xiàng)目的 maven 管理配置文件,我們打開(kāi)該文件, 找到第 127 行,它告訴了我們例子程序的主程序入口:


找到src\main\java\org\apache\hadoop\examples目錄

打開(kāi)主入口程序,看源代碼:

找到這一步,我們就能知道其實(shí) wordcount 程序的實(shí)際程序就是 WordCount.class,這就是我 們想要找的例子程序的源碼。
WordCount.java源碼

View Code
MapReduce 示例程序編寫及編碼規(guī)范
上一步,我們查看了 WordCount 這個(gè) MapReduce 程序的源碼編寫,可以得出幾點(diǎn)結(jié)論:
1、 該程序有一個(gè) main 方法,來(lái)啟動(dòng)任務(wù)的運(yùn)行,其中 job 對(duì)象就存儲(chǔ)了該程序運(yùn)行的必要 信息,比如指定 Mapper 類和 Reducer 類 job.setMapperClass(TokenizerMapper.class); job.setReducerClass(IntSumReducer.class);
2、 該程序中的 TokenizerMapper 類繼承了 Mapper 類
3、 該程序中的 IntSumReducer 類繼承了 Reducer 類
總結(jié):MapReduce 程序的業(yè)務(wù)編碼分為兩個(gè)大部分,一部分配置程序的運(yùn)行信息,一部分 編寫該 MapReduce 程序的業(yè)務(wù)邏輯,并且業(yè)務(wù)邏輯的 map 階段和 reduce 階段的代碼分別繼 承 Mapper 類和 Reducer 類
編寫自己的 Wordcount 程序

View Code
MapReduce 程序編寫規(guī)范
1、用戶編寫的程序分成三個(gè)部分:Mapper,Reducer,Driver(提交運(yùn)行 MR 程序的客戶端)
2、Mapper 的輸入數(shù)據(jù)是 KV 對(duì)的形式(KV 的類型可自定義)
3、Mapper 的輸出數(shù)據(jù)是 KV 對(duì)的形式(KV 的類型可自定義)
4、Mapper 中的業(yè)務(wù)邏輯寫在 map()方法中
5、map()方法(maptask 進(jìn)程)對(duì)每一個(gè)<k,v>調(diào)用一次
6、Reducer 的輸入數(shù)據(jù)類型對(duì)應(yīng) Mapper 的輸出數(shù)據(jù)類型,也是 KV 對(duì)的形式
7、Reducer 的業(yè)務(wù)邏輯寫在 reduce()方法中
8、Reducetask 進(jìn)程對(duì)每一組相同 k 的<k,v>組調(diào)用一次 reduce()方法
9、用戶自定義的 Mapper 和 Reducer 都要繼承各自的父類
10、整個(gè)程序需要一個(gè) Drvier 來(lái)進(jìn)行提交,提交的是一個(gè)描述了各種必要信息的 job 對(duì)象
WordCount 的業(yè)務(wù)邏輯
1、 maptask 階段處理每個(gè)數(shù)據(jù)分塊的單詞統(tǒng)計(jì)分析,思路是每遇到一個(gè)單詞則把其轉(zhuǎn)換成 一個(gè) key-value 對(duì),比如單詞 hello,就轉(zhuǎn)換成<’hello’,1>發(fā)送給 reducetask 去匯總
2、 reducetask 階段將接受 maptask 的結(jié)果,來(lái)做匯總計(jì)數(shù)
MapReduce 運(yùn)行方式及 Debug
集群運(yùn)行模式
打 jar 包,提交任務(wù)到集群運(yùn)行,適用:生產(chǎn)環(huán)境,不適用:測(cè)試,調(diào)試,開(kāi)發(fā)
要點(diǎn)一:首先要把代碼打成 jar 上傳到 linux 服務(wù)器
要點(diǎn)二:用 hadoop jar 的命令去提交代碼到 yarn 集群運(yùn)行
要點(diǎn)三:處理的數(shù)據(jù)和輸出結(jié)果應(yīng)該位于 hdfs 文件系統(tǒng)
要點(diǎn)四:如果需要在 windows 中的 eclipse 當(dāng)中直接提交 job 到集群,則需要修改 YarnRunner 類,這個(gè)比較復(fù)雜,不建議使用
本地運(yùn)行模式
Eclipse 開(kāi)發(fā)環(huán)境下本地運(yùn)行,好處是方便調(diào)試和測(cè)試
直接在IDE環(huán)境中進(jìn)行環(huán)境 : eclipse
1、直接運(yùn)行在本地,讀取本地?cái)?shù)據(jù)
2、直接運(yùn)行在本地,讀取遠(yuǎn)程的文件系統(tǒng)的數(shù)據(jù)
3、直接在IDE中提交任務(wù)給YARN集群運(yùn)行
|