Hadoop Map-Reduce使用教程
本節(jié)從用戶的角度出發(fā),全面地介紹了Hadoop Map-Reduce框架的各個(gè)方面,希望通過(guò)本節(jié)介紹大家對(duì)Hadoop Map-Reduce有一定的認(rèn)識(shí),歡迎大家一起來(lái)學(xué)習(xí)。
先決條件
請(qǐng)先確認(rèn)Hadoop被正確安裝、配置和正常運(yùn)行中。
概述
Hadoop Map-Reduce是一個(gè)使用簡(jiǎn)易的軟件框架,基于它寫(xiě)出來(lái)的應(yīng)用程序能夠運(yùn)行在由上千個(gè)商用機(jī)器組成的大型集群上,并以一種可靠容錯(cuò)的方式并行處理上T級(jí)別的數(shù)據(jù)集。
一個(gè)Map-Reduce作業(yè)(job)通常會(huì)把輸入的數(shù)據(jù)集切分為若干獨(dú)立的數(shù)據(jù)塊,由map任務(wù)(task)以完全并行的方式處理它們。框架會(huì)對(duì)map的輸出先進(jìn)行排序,然后把結(jié)果輸入給reduce任務(wù)。通常作業(yè)
的輸入和輸出都會(huì)被存儲(chǔ)在文件系統(tǒng)中。整個(gè)框架負(fù)責(zé)任務(wù)的調(diào)度和監(jiān)控,以及重新執(zhí)行已經(jīng)失敗的任務(wù)。
通常,Map-Reduce框架和分布式文件系統(tǒng)是運(yùn)行在一組相同的節(jié)點(diǎn)上的,也就是說(shuō),計(jì)算節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)通常在一起。這種配置允許框架在那些已經(jīng)存好數(shù)據(jù)的節(jié)點(diǎn)上高效地調(diào)度任務(wù),這可以使整個(gè)集群的網(wǎng)絡(luò)帶寬被非常高效地利用。
Map-Reduce框架由單獨(dú)一個(gè)masterJobTracker和每個(gè)集群節(jié)點(diǎn)一個(gè)slaveTaskTracker共同組成。這個(gè)master負(fù)責(zé)調(diào)度構(gòu)成一個(gè)作業(yè)的所有任務(wù),這些任務(wù)分布在不同的slave上,master監(jiān)控它們的執(zhí)行,重新執(zhí)行已經(jīng)失敗的任務(wù)。而slave僅負(fù)責(zé)執(zhí)行由master指派的任務(wù)。
應(yīng)用程序至少應(yīng)該指明輸入/輸出的位置(路徑),并通過(guò)實(shí)現(xiàn)合適的接口或抽象類提供map和reduce函數(shù)。再加上其他作業(yè)的參數(shù),就構(gòu)成了作業(yè)配置(jobconfiguration)。然后,Hadoop的jobclient提交作業(yè)(jar包/可執(zhí)行程序等)和配置信息給JobTracker,后者負(fù)責(zé)分發(fā)這些軟件和配置信息給slave、調(diào)度任務(wù)且監(jiān)控它們的執(zhí)行,同時(shí)提供狀態(tài)和診斷信息給job-client。
雖然Hadoop框架是用JavaTM實(shí)現(xiàn)的,但Map-Reduce應(yīng)用程序則不一定要用Java來(lái)寫(xiě)。
HadoopStreaming是一種運(yùn)行作業(yè)的實(shí)用工具,它允許用戶創(chuàng)建和運(yùn)行任何可執(zhí)行程序(例如:Shell工具)來(lái)做為mapper和reducer。
HadoopPipes是一個(gè)與SWIG兼容的C++API(沒(méi)有基于JNITM技術(shù)),它也可用于實(shí)現(xiàn)Map-Reduce應(yīng)用程序。
Hadoop Map-Reduce輸入與輸出
Map-Reduce框架運(yùn)轉(zhuǎn)在<key,value>鍵值對(duì)上,也就是說(shuō),框架把作業(yè)的輸入看為是一組<key,value>鍵值對(duì),同樣也產(chǎn)出一組<key,value>鍵值對(duì)做為作業(yè)的輸出,這兩組鍵值對(duì)的類型可能不同。
框架需要對(duì)key和value的類(classes)進(jìn)行序列化操作,因此,這些類需要實(shí)現(xiàn)Writable接口。另外,為了方便框架執(zhí)行排序操作,key類必須實(shí)現(xiàn)WritableComparable接口。
一個(gè)Map-Reduce作業(yè)的輸入和輸出類型如下所示:
(input)<k1,v1>->map-><k2,v2>->combine-><k2,v2>->reduce-><k3,v3>(output)
Hadoop Map-Reduce-用戶界面
這部分文檔為用戶將會(huì)面臨的Map-Reduce框架中的各個(gè)環(huán)節(jié)提供了適當(dāng)?shù)募?xì)節(jié)。這應(yīng)該會(huì)幫助用戶更細(xì)粒度地去實(shí)現(xiàn)、配置和調(diào)優(yōu)作業(yè)。然而,請(qǐng)注意每個(gè)類/接口的javadoc文檔依然是能提供最全面的
文檔;本文只是想起到教程的作用。
我們會(huì)先看看Mapper和Reducer接口。應(yīng)用程序通常會(huì)通過(guò)提供map和reduce方法來(lái)實(shí)現(xiàn)它們。
然后,我們會(huì)討論其他的核心接口,其中包括:JobConf,JobClient,Partitioner,OutputCollector,Reporter,InputFormat,OutputFormat等等。
最后,我們將以通過(guò)討論框架一些有用的功能點(diǎn)(例如:DistributedCache,IsolationRunner等等)的方式來(lái)收尾。
Hadoop Map-Reduce核心功能描述
應(yīng)用程序通常會(huì)通過(guò)提供map和reduce來(lái)實(shí)現(xiàn)Mapper和Reducer接口,它們組成作業(yè)的核心。
Mapper
Mapper將輸入鍵值對(duì)(key/valuepair)映射到一組中間格式的鍵值對(duì)集合。
Map是一類將輸入記錄集轉(zhuǎn)換為中間格式記錄集的獨(dú)立任務(wù)。這種轉(zhuǎn)換的中間格式記錄集不需要與輸入記錄集的類型一致。一個(gè)給定的輸入鍵值對(duì)可以映射成0個(gè)或多個(gè)輸出鍵值對(duì)。
HadoopMap-Reduce框架為每一個(gè)InputSplit產(chǎn)生一個(gè)map任務(wù),而每個(gè)InputSplit是由對(duì)應(yīng)每個(gè)作業(yè)的InputFormat產(chǎn)生的。
概括地說(shuō),對(duì)Mapper的實(shí)現(xiàn)者需要重寫(xiě)JobConfigurable.configure(JobConf)方法,這個(gè)方法需要傳遞一個(gè)JobConf參數(shù),目的是完成Mapper的初始化工作。然后,框架為這個(gè)任務(wù)的InputSplit中每個(gè)鍵值對(duì)調(diào)用一次map(WritableComparable,Writable,OutputCollector,Reporter)操作。之后,應(yīng)用程序可以通過(guò)重寫(xiě)Closeable.close()方法來(lái)執(zhí)行相應(yīng)的清理工作。
輸出鍵值對(duì)不需要與輸入鍵值對(duì)的類型一致。一個(gè)給定的輸入鍵值對(duì)可以映射成0個(gè)或多個(gè)輸出鍵值對(duì)。通過(guò)調(diào)用OutputCollector.collect(WritableComparable,Writable)可以收集輸出的鍵值對(duì)。
應(yīng)用程序可以使用Reporter報(bào)告進(jìn)度,設(shè)定應(yīng)用級(jí)別的狀態(tài)消息,更新Counters(計(jì)數(shù)器),或者僅是表明自己運(yùn)行正常。
框架隨后會(huì)把與一個(gè)特定key關(guān)聯(lián)的所有中間過(guò)程的值(value)分成組,然后把它們傳給Reducer以產(chǎn)出最終的結(jié)果。用戶可以通過(guò)JobConf.setOutputKeyComparatorClass(Class)來(lái)指定具體負(fù)責(zé)分組的Comparator。
Mapper的輸出被排序后,就被劃分給每個(gè)Reducer。分塊的總數(shù)目和一個(gè)作業(yè)的reduce任務(wù)的數(shù)目是一樣的。用戶可以通過(guò)實(shí)現(xiàn)自定義的Partitioner來(lái)控制哪個(gè)key被分配去哪個(gè)Reducer。
用戶可選擇通過(guò)JobConf.setCombinerClass(Class)指定一個(gè)combiner,它負(fù)責(zé)對(duì)中間過(guò)程的輸出進(jìn)行本地的聚集,這會(huì)有助于降低從Mapper到Reducer數(shù)據(jù)傳輸量。
這些被排好序的中間過(guò)程的輸出結(jié)果通常是以SequenceFile格式的文件被存放的。應(yīng)用程序可以通過(guò)JobConf控制對(duì)這些中間結(jié)果是否進(jìn)行壓縮以及怎么壓縮,使用哪種ompressionCodec。本節(jié)關(guān)于Hadoop Map-Reduce相關(guān)內(nèi)容介紹到這里。
【編輯推薦】
- Hadoop MapReduce的簡(jiǎn)單應(yīng)用Cascading詳解
- 如何實(shí)現(xiàn)Cassandra與Hadoop MapReduce的整合?
- Hadoop集群與Hadoop性能優(yōu)化
- HadoopHBase實(shí)現(xiàn)配置簡(jiǎn)單的單機(jī)環(huán)境
- 深入剖析Hadoop HBase