新聞中心
MapReduce,本質(zhì)就是一種編程模型,也是一個(gè)處理大規(guī)模數(shù)據(jù)集的相關(guān)實(shí)現(xiàn)。之所以會(huì)有這個(gè)模型,目的是為了隱藏“并行計(jì)算、容錯(cuò)處理、數(shù)據(jù)分發(fā)、負(fù)載均衡”,從而實(shí)現(xiàn)大數(shù)據(jù)計(jì)算的一種抽象。

成都創(chuàng)新互聯(lián)擁有網(wǎng)站維護(hù)技術(shù)和項(xiàng)目管理團(tuán)隊(duì),建立的售前、實(shí)施和售后服務(wù)體系,為客戶提供定制化的網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站維護(hù)、遂寧聯(lián)通機(jī)房解決方案。為客戶網(wǎng)站安全和日常運(yùn)維提供整體管家式外包優(yōu)質(zhì)服務(wù)。我們的網(wǎng)站維護(hù)服務(wù)覆蓋集團(tuán)企業(yè)、上市公司、外企網(wǎng)站、商城網(wǎng)站建設(shè)、政府網(wǎng)站等各類型客戶群體,為全球數(shù)千家企業(yè)提供全方位網(wǎng)站維護(hù)、服務(wù)器維護(hù)解決方案。
1、環(huán)境說明
部署節(jié)點(diǎn)操作系統(tǒng)為CentOS,防火墻和SElinux禁用,創(chuàng)建了一個(gè)shiyanlou用戶并在系統(tǒng)根目錄下創(chuàng)建/app目錄,用于存放Hadoop等組件運(yùn)行包。因?yàn)樵撃夸浻糜诎惭bhadoop等組件程序,用戶對(duì)shiyanlou必須賦予rwx權(quán)限(一般做法是root用戶在根目錄下創(chuàng)建/app目錄,并修改該目錄擁有者為shiyanlou(chown –R shiyanlou:shiyanlou /app)。
**Hadoop**搭建環(huán)境:
l 虛擬機(jī)操作系統(tǒng): CentOS6.6 64位,單核,1G內(nèi)存
l JDK:1.7.0_55 64位
l Hadoop:1.1.2
2、MapReduce原理
2.1 MapReduce簡(jiǎn)介
MapReduce 是現(xiàn)今一個(gè)非常流行的分布式計(jì)算框架,它被設(shè)計(jì)用于并行計(jì)算海量數(shù)據(jù)。第一個(gè)提出該技術(shù)框架的是Google 公司,而Google 的靈感則來自于函數(shù)式編程語(yǔ)言,如LISP,Scheme,ML 等。MapReduce 框架的核心步驟主要分兩部分:Map 和Reduce。當(dāng)你向MapReduce 框架提交一個(gè)計(jì)算作業(yè)時(shí),它會(huì)首先把計(jì)算作業(yè)拆分成若干個(gè)Map 任務(wù),然后分配到不同的節(jié)點(diǎn)上去執(zhí)行,每一個(gè)Map 任務(wù)處理輸入數(shù)據(jù)中的一部分,當(dāng)Map 任務(wù)完成后,它會(huì)生成一些中間文件,這些中間文件將會(huì)作為Reduce 任務(wù)的輸入數(shù)據(jù)。Reduce 任務(wù)的主要目標(biāo)就是把前面若干個(gè)Map 的輸出匯總到一起并輸出。從高層抽象來看,MapReduce的數(shù)據(jù)流圖如下圖所示:
2.2 MapReduce流程分析
2.2.1 Map過程
\1. 每個(gè)輸入分片會(huì)讓一個(gè)map任務(wù)來處理,默認(rèn)情況下,以HDFS的一個(gè)塊的大?。J(rèn)為64M)為一個(gè)分片,當(dāng)然我們也可以設(shè)置塊的大小。map輸出的結(jié)果會(huì)暫且放在一個(gè)環(huán)形內(nèi)存緩沖區(qū)中(該緩沖區(qū)的大小默認(rèn)為100M,由io.sort.mb屬性控制),當(dāng)該緩沖區(qū)快要溢出時(shí)(默認(rèn)為緩沖區(qū)大小的80%,由io.sort.spill.percent屬性控制),會(huì)在本地文件系統(tǒng)中創(chuàng)建一個(gè)溢出文件,將該緩沖區(qū)中的數(shù)據(jù)寫入這個(gè)文件;
\2. 在寫入磁盤之前,線程首先根據(jù)reduce任務(wù)的數(shù)目將數(shù)據(jù)劃分為相同數(shù)目的分區(qū),也就是一個(gè)reduce任務(wù)對(duì)應(yīng)一個(gè)分區(qū)的數(shù)據(jù)。這樣做是為了避免有些reduce任務(wù)分配到大量數(shù)據(jù),而有些reduce任務(wù)卻分到很少數(shù)據(jù),甚至沒有分到數(shù)據(jù)的尷尬局面。其實(shí)分區(qū)就是對(duì)數(shù)據(jù)進(jìn)行hash的過程。然后對(duì)每個(gè)分區(qū)中的數(shù)據(jù)進(jìn)行排序,如果此時(shí)設(shè)置了Combiner,將排序后的結(jié)果進(jìn)行Combia操作,這樣做的目的是讓盡可能少的數(shù)據(jù)寫入到磁盤;
\3. 當(dāng)map任務(wù)輸出最后一個(gè)記錄時(shí),可能會(huì)有很多的溢出文件,這時(shí)需要將這些文件合并。合并的過程中會(huì)不斷地進(jìn)行排序和combia操作,目的有兩個(gè):
l盡量減少每次寫入磁盤的數(shù)據(jù)量
l盡量減少下一復(fù)制階段網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量。最后合并成了一個(gè)已分區(qū)且已排序的文件。為了減少網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量,這里可以將數(shù)據(jù)壓縮,只要將mapred.compress.map.out設(shè)置為true就可以了
\4. 將分區(qū)中的數(shù)據(jù)拷貝給相對(duì)應(yīng)的reduce任務(wù)。有人可能會(huì)問:分區(qū)中的數(shù)據(jù)怎么知道它對(duì)應(yīng)的reduce是哪個(gè)呢?其實(shí)map任務(wù)一直和其父TaskTracker保持聯(lián)系,而TaskTracker又一直和JobTracker保持心跳。所以JobTracker中保存了整個(gè)集群中的宏觀信息。只要reduce任務(wù)向JobTracker獲取對(duì)應(yīng)的map輸出位置就可以了。
2.2.2 Reduce過程
\1. Reduce會(huì)接收到不同map任務(wù)傳來的數(shù)據(jù),并且每個(gè)map傳來的數(shù)據(jù)都是有序的。如果reduce端接受的數(shù)據(jù)量相當(dāng)小,則直接存儲(chǔ)在內(nèi)存中(緩沖區(qū)大小由mapred.job.shuffle.input.buffer.percent屬性控制,表示用作此用途的堆空間的百分比),如果數(shù)據(jù)量超過了該緩沖區(qū)大小的一定比例(由mapred.job.shuffle.merge.percent決定),則對(duì)數(shù)據(jù)合并后溢寫到磁盤中;
\2. 隨著溢寫文件的增多,后臺(tái)線程會(huì)將它們合并成一個(gè)更大的有序的文件,這樣做是為了給后面的合并節(jié)省時(shí)間。其實(shí)不管在map端還是reduce端,MapReduce都是反復(fù)地執(zhí)行排序,合并操作;
\3. 合并的過程中會(huì)產(chǎn)生許多的中間文件(寫入磁盤了),但MapReduce會(huì)讓寫入磁盤的數(shù)據(jù)盡可能地少,并且最后一次合并的結(jié)果并沒有寫入磁盤,而是直接輸入到reduce函數(shù)。
2.3 MapReduce工作機(jī)制剖析
1.在集群中的任意一個(gè)節(jié)點(diǎn)提交MapReduce程序;
2.JobClient收到作業(yè)后,JobClient向JobTracker請(qǐng)求獲取一個(gè)Job ID;
3.將運(yùn)行作業(yè)所需要的資源文件復(fù)制到HDFS上(包括MapReduce程序打包的JAR文件、配置文件和客戶端計(jì)算所得的輸入劃分信息),這些文件都存放在JobTracker專門為該作業(yè)創(chuàng)建的文件夾中,文件夾名為該作業(yè)的Job ID;
4.獲得作業(yè)ID后,提交作業(yè);
5.JobTracker接收到作業(yè)后,將其放在一個(gè)作業(yè)隊(duì)列里,等待作業(yè)調(diào)度器對(duì)其進(jìn)行調(diào)度,當(dāng)作業(yè)調(diào)度器根據(jù)自己的調(diào)度算法調(diào)度到該作業(yè)時(shí),會(huì)根據(jù)輸入劃分信息為每個(gè)劃分創(chuàng)建一個(gè)map任務(wù),并將map任務(wù)分配給TaskTracker執(zhí)行;
6.對(duì)于map和reduce任務(wù),TaskTracker根據(jù)主機(jī)核的數(shù)量和內(nèi)存的大小有固定數(shù)量的map槽和reduce槽。這里需要強(qiáng)調(diào)的是:map任務(wù)不是隨隨便便地分配給某個(gè)TaskTracker的,這里有個(gè)概念叫:數(shù)據(jù)本地化(Data-Local)。意思是:將map任務(wù)分配給含有該map處理的數(shù)據(jù)塊的TaskTracker上,同時(shí)將程序JAR包復(fù)制到該TaskTracker上來運(yùn)行,這叫“運(yùn)算移動(dòng),數(shù)據(jù)不移動(dòng)”;
7.TaskTracker每隔一段時(shí)間會(huì)給JobTracker發(fā)送一個(gè)心跳,告訴JobTracker它依然在運(yùn)行,同時(shí)心跳中還攜帶著很多的信息,比如當(dāng)前map任務(wù)完成的進(jìn)度等信息。當(dāng)JobTracker收到作業(yè)的最后一個(gè)任務(wù)完成信息時(shí),便把該作業(yè)設(shè)置成“成功”。當(dāng)JobClient查詢狀態(tài)時(shí),它將得知任務(wù)已完成,便顯示一條消息給用戶;
8.運(yùn)行的TaskTracker從HDFS中獲取運(yùn)行所需要的資源,這些資源包括MapReduce程序打包的JAR文件、配置文件和客戶端計(jì)算所得的輸入劃分等信息;
9.TaskTracker獲取資源后啟動(dòng)新的JVM虛擬機(jī);
\10. 運(yùn)行每一個(gè)任務(wù);
文章名稱:Hadoop—MapReduce編程思想
分享鏈接:http://m.fisionsoft.com.cn/article/djgdses.html


咨詢
建站咨詢
