1.MapReduce是什么试浙?
--Hadoop MapReduce是一個(gè)軟件框架佳恬,基于該框架能夠容易地編寫應(yīng)用程序,這些應(yīng)用程序能夠運(yùn)行在由上千個(gè)商用機(jī)器組成的大集群上孽尽,并以一種可靠的窖壕,具有容錯能力的方式并行地處理上TB級別的海量數(shù)據(jù)集。
2.MapReduce的特點(diǎn):
? ?軟件框架
? ?并行處理
? ?可靠且容錯
? 大規(guī)模集群
? ?海量數(shù)據(jù)集
3.MapReduce的思想:“分而治之”
(1)Mapper負(fù)責(zé)“分”
把簡單的任務(wù)分解為若干個(gè)“簡單的任務(wù)”來處理:
數(shù)據(jù)或計(jì)算的規(guī)模相對原任務(wù)要大大縮猩寂瞻讽;
就近計(jì)算原則,任務(wù)會分配到存放著所需數(shù)據(jù)的節(jié)點(diǎn)上進(jìn)行計(jì)算熏挎;
這些小任務(wù)可以并行計(jì)算彼此間幾乎沒有依賴關(guān)系速勇。
(2)Reduce負(fù)責(zé)對map階段的結(jié)果進(jìn)行匯總
至于需要多少個(gè)Reducer,可以根據(jù)具體問題坎拐,通過在mapred-site.xml配置文件里設(shè)置參數(shù)mapred.reduce.tasks的值烦磁,缺省值為1养匈。
4.MapReduce工作機(jī)制
★★作業(yè)執(zhí)行涉及4個(gè)獨(dú)立的實(shí)體:★★
(1)客戶端,用來提交MapReduce的作業(yè)
(編寫MapReduce程序都伪,配置作業(yè)呕乎,提交作業(yè),這就是程序員完成的工作)
(2)JobTracker陨晶,用來協(xié)調(diào)作業(yè)的運(yùn)行
(初始化作業(yè)猬仁,分配作業(yè),與TaskTracker通信先誉,協(xié)調(diào)整個(gè)作業(yè)的執(zhí)行)
(3)TaskTracker湿刽,用來處理作業(yè)劃分后的任務(wù)
(保持與JobTracker的通信,在分配的數(shù)據(jù)片段上執(zhí)行Map或Reduce任務(wù)褐耳。)
(4)HDFS叭爱,用來在其他實(shí)體間共享作業(yè)文件
(保存作業(yè)的數(shù)據(jù)、配置信息等等漱病,最后結(jié)果也是保存在hdfs上面)
JobTracker VS TaskTracker:
JobTracker只能有一個(gè)买雾,就和hdfs里的namenode一樣存在單點(diǎn)故障;
TaskTracker可以有多個(gè)杨帽。
5.mapreduce運(yùn)行步驟
? ? ?在hadoop中漓穿,一個(gè)mapreduce作業(yè)會把輸入的數(shù)據(jù)集分為若干獨(dú)立的數(shù)據(jù)塊,由Map任務(wù)以完全并行地方式處理注盈。
框架會對Map的輸出先進(jìn)行排序晃危,然后把結(jié)果輸入給Reduce任務(wù)。
作業(yè)的輸入和輸出都會被存儲在文件系統(tǒng)中老客,整個(gè)框架負(fù)責(zé)任務(wù)的調(diào)度和監(jiān)控僚饭,以及重新執(zhí)行已經(jīng)關(guān)閉的任務(wù)。
MapReduce框架和分布式文件系統(tǒng)是運(yùn)行在一組相同的節(jié)點(diǎn)胧砰,計(jì)算節(jié)點(diǎn)和存儲節(jié)點(diǎn)都是在一起的鳍鸵。
? ? ?詳細(xì)步驟:
首先是客戶端要編寫好mapreduce程序,配置好mapreduce的作業(yè)也就是job尉间,
接下來就是提交job了偿乖,提交job是提交到JobTracker上的,這個(gè)時(shí)候JobTracker就會構(gòu)建這個(gè)job哲嘲,具體就是分配一個(gè)新的job任務(wù)的ID值
接下來它會做檢查操作贪薪,這個(gè)檢查就是確定輸出目錄是否存在,如果存在那么job就不能正常運(yùn)行下去眠副,JobTracker會拋出錯誤給客戶端河绽,接下來還要檢查輸入目錄是否存在霜旧,如果不存在同樣拋出錯誤试吁,如果存在JobTracker會根據(jù)輸入計(jì)算輸入分片(Input Split),如果分片計(jì)算不出來也會拋出錯誤毫别,這些都做好了JobTracker就會配置Job需要的資源了。
分配好資源后庞萍,JobTracker就會初始化作業(yè)拧烦,初始化主要做的是將Job放入一個(gè)內(nèi)部的隊(duì)列忘闻,讓配置好的作業(yè)調(diào)度器能調(diào)度到這個(gè)作業(yè)钝计,作業(yè)調(diào)度器會初始化這個(gè)job,初始化就是創(chuàng)建一個(gè)正在運(yùn)行的job對象(封裝任務(wù)和記錄信息)齐佳,以便JobTracker跟蹤job的狀態(tài)和進(jìn)程私恬。
初始化完畢后,作業(yè)調(diào)度器會獲取輸入分片信息(input split)炼吴,每個(gè)分片創(chuàng)建一個(gè)map任務(wù)本鸣。
接下來就是任務(wù)分配了,這個(gè)時(shí)候tasktracker會運(yùn)行一個(gè)簡單的循環(huán)機(jī)制定期發(fā)送心跳給jobtracker硅蹦,心跳間隔是5秒荣德,程序員可以配置這個(gè)時(shí)間,心跳就是jobtracker和tasktracker溝通的橋梁童芹,通過心跳涮瞻,jobtracker可以監(jiān)控tasktracker是否存活,也可以獲取tasktracker處理的狀態(tài)和問題假褪,同時(shí)tasktracker也可以通過心跳里的返回值獲取jobtracker給它的操作指令署咽。
任務(wù)分配好后就是執(zhí)行任務(wù)了。在任務(wù)執(zhí)行時(shí)候jobtracker可以通過心跳機(jī)制監(jiān)控tasktracker的狀態(tài)和進(jìn)度生音,同時(shí)也能計(jì)算出整個(gè)job的狀態(tài)和進(jìn)度宁否,而tasktracker也可以本地監(jiān)控自己的狀態(tài)和進(jìn)度。當(dāng)jobtracker獲得了最后一個(gè)完成指定任務(wù)的tasktracker操作成功的通知時(shí)候缀遍,jobtracker會把整個(gè)job狀態(tài)置為成功慕匠,然后當(dāng)客戶端查詢job運(yùn)行狀態(tài)時(shí)候(注意:這個(gè)是異步操作),客戶端會查到j(luò)ob完成的通知的域醇。如果job中途失敗絮重,mapreduce也會有相應(yīng)機(jī)制處理,一般而言如果不是程序員程序本身有bug歹苦,mapreduce錯誤處理機(jī)制都能保證提交的job能正常完成青伤。
Job job;
if(job.waitForComplete(true)?0:1? ? //等待job的完成
{
System.out.println("ok")
else
System.out.println("failure")
}
6.MapReduce的輸入輸出
一個(gè)MapReduce作業(yè)的輸入和輸出類型:
會有三組<key,value>鍵值對類型的存在