Hadoop入門專家引導(dǎo)
本節(jié)和大家介紹一下Hadoop入門,主要內(nèi)容是Hadoop概論,Hadoop的基本概念等內(nèi)容,希望通過本節(jié)的介紹,大家對Hadoop有初步的認識。下面是具體介紹。
Hadoop入門
Hadoop是GoogleMapReduce的一個Java實現(xiàn)。MapReduce是一種簡化的分布式編程模式,讓程序自動分布到一個由普通機器組成的超大集群上并發(fā)執(zhí)行。就如同java程序員可以不考慮內(nèi)存泄露一樣,MapReduce的run-time系統(tǒng)會解決輸入數(shù)據(jù)的分布細節(jié),跨越機器集群的程序執(zhí)行調(diào)度,處理機器的失效,并且管理機器之間的通訊請求。這樣的模式允許程序員可以不需要有什么并發(fā)處理或者分布式系統(tǒng)的經(jīng)驗,就可以處理超大的分布式系統(tǒng)得資源。
一、概論
作為Hadoop程序員,他要做的事情就是:
1、定義Mapper,處理輸入的Key-Value對,輸出中間結(jié)果。
2、定義Reducer,可選,對中間結(jié)果進行規(guī)約,輸出最終結(jié)果。
3、定義InputFormat和OutputFormat,可選,InputFormat將每行輸入文件的內(nèi)容轉(zhuǎn)換為Java類供Mapper函數(shù)使用,不定義時默認為String。
4、定義main函數(shù),在里面定義一個Job并運行它。
然后的事情就交給系統(tǒng)了。Hadoop入門首先要了解一下基本概念。
1.基本概念:Hadoop的HDFS實現(xiàn)了google的GFS文件系統(tǒng),NameNode作為文件系統(tǒng)的負責(zé)調(diào)度運行在master,DataNode運行在每個機器上。同時Hadoop實現(xiàn)了Google的MapReduce,JobTracker作為MapReduce的總調(diào)度運行在master,TaskTracker則運行在每個機器上執(zhí)行Task。
2.main()函數(shù),創(chuàng)建JobConf,定義Mapper,Reducer,Input/OutputFormat和輸入輸出文件目錄,***把Job提交給JobTracker,等待Job結(jié)束。
3.JobTracker,創(chuàng)建一個InputFormat的實例,調(diào)用它的getSplits()方法,把輸入目錄的文件拆分成FileSplist作為Mappertask的輸入,生成Mappertask加入Queue。
4.TaskTracker向JobTracker索求下一個Map/Reduce。
MapperTask先從InputFormat創(chuàng)建RecordReader,循環(huán)讀入FileSplits的內(nèi)容生成Key與Value,傳給Mapper函數(shù),處理完后中間結(jié)果寫成SequenceFile.
ReducerTask從運行Mapper的TaskTracker的Jetty上使用http協(xié)議獲取所需的中間內(nèi)容(33%),Sort/Merge后(66%),執(zhí)行Reducer函數(shù),***按照OutputFormat寫入結(jié)果目錄。
TaskTracker每10秒向JobTracker報告一次運行情況,每完成一個Task10秒后,就會向JobTracker索求下一個Task。
Nutch項目的全部數(shù)據(jù)處理都構(gòu)建在Hadoop之上,詳見ScalableComputingwithHadoop。下面我們再來看一下Hadoop入門介紹中程序員編寫的代碼。
二、程序員編寫的代碼
我們做一個簡單的分布式的Grep,簡單對輸入文件進行逐行的正則匹配,如果符合就將該行打印到輸出文件。因為是簡單的全部輸出,所以我們只要寫Mapper函數(shù),不用寫Reducer函數(shù),也不用定義Input/OutputFormat。
 
- packagedemo.hadoop
 - publicclassHadoopGrep{
 - publicstaticclassRegMapperextendsMapReduceBaseimplementsMapper{
 - privatePatternpattern;
 - publicvoidconfigure(JobConfjob){
 - pattern=Pattern.compile(job.get("mapred.mapper.regex"));
 - }
 - publicvoidmap(WritableComparablekey,Writablevalue,OutputCollectoroutput,Reporterreporter)
 - throwsIOException{
 - Stringtext=((Text)value).toString();
 - Matchermatcher=pattern.matcher(text);
 - if(matcher.find()){
 - output.collect(key,value);
 - }}
 - }
 - privateHadoopGrep(){
 - }//singleton
 - publicstaticvoidmain(String[]args)throwsException{
 - JobConfgrepJob=newJobConf(HadoopGrep.class);
 - grepJob.setJobName("grep-search");
 - grepJob.set("mapred.mapper.regex",args[2]);
 - grepJob.setInputPath(newPath(args[0]));
 - grepJob.setOutputPath(newPath(args[1]));
 - grepJob.setMapperClass(RegMapper.class);
 - grepJob.setReducerClass(IdentityReducer.class);
 - JobClient.runJob(grepJob);
 - }
 - }
 
RegMapper類的configure()函數(shù)接受由main函數(shù)傳入的查找字符串,map()函數(shù)進行正則匹配,key是行數(shù),value是文件行的內(nèi)容,符合的文件行放入中間結(jié)果。
main()函數(shù)定義由命令行參數(shù)傳入的輸入輸出目錄和匹配字符串,Mapper函數(shù)為RegMapper類,Reduce函數(shù)是什么都不做,直接把中間結(jié)果輸出到最終結(jié)果的的IdentityReducer類,運行Job。整個代碼非常簡單,絲毫沒有分布式編程的任何細節(jié)。請期待下節(jié)關(guān)于Hadoop入門介紹。
 
【編輯推薦】
- Hadoop安裝與使用如何進行?
 - Hadoop開源已經(jīng)實現(xiàn)
 - Hadoop集群與Hadoop性能優(yōu)化
 - Hadoop 從Yahoo向Google的技術(shù)轉(zhuǎn)折
 - Hadoop起源及其四大特性詳解
 















 
 
 
 
 
 
 