靈魂-放水

          為學日益,為道日損。

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            296 Posts :: 10 Stories :: 274 Comments :: 0 Trackbacks
          作者:江南白衣

          ??? Hadoop 是 Google labs 的MapReduce的一個實現(xiàn),Nutch項目的全部數(shù)據(jù)處理都構建在其之上。MapReduce是一種簡化的分布式編程模式,讓程序可以自動在普通機器組成的集群中以并行方式分布執(zhí)行。

          ??? 就如同java程序員可以不考慮內存泄露一樣,MapReduce程序員也不許要關心海量數(shù)據(jù)如何被分配到多臺機器上,不需要考慮機器失效的處理,不需要考慮這些機器間如何協(xié)作共同完成工作,程序員不需要什么并發(fā)處理或者分布式系統(tǒng)的經驗,就可以進行分布式的編程。

          ?? MapReduce來源于函數(shù)式編程的Map,Reduce概念,Map是映射,Reduce是規(guī)約。說了非常簡單,就真的是非常簡單的,先看Hadoop自帶的sample-WordCount?,再看Nutch里的Indexer,Fetcher兩個實戰(zhàn)的例子,最后閱讀Hadoop wiki 上的HadoopMapReduce,很快就可以上手:
          ?
          ?? MapReduce過程簡記:
          ??? 1.根據(jù)輸入路徑,先用FileSplit把輸入的文件剁碎,根據(jù)InputFormat(讀入資料的格式)內含的RecordReader把資料讀入成一組(key,value)對,然后按mapper count平均分給不同的Mapper處理。(這段因為沒看過源碼,還有點模糊)
          ??? 2.Mapper進行Map操作 :: (InitialKey, IntialValue) -> [(InterKey, InterValue)] 從Inupt key,value 產生中間數(shù)據(jù)集
          ??? 3.Reducer進行Reduce操作:: (Interkey, InterValuesIterator) -> [(InterKey, InterValue)],Reducer遍歷所有節(jié)點取得需要的中間數(shù)據(jù)集,再對其進行去重、過濾等后期處理,得到結果。
          ?? ?4.最后由OutputFormat類(輸出資料的格式)內含的RecordWriter,將最終結果輸出。結果輸出可以是文件,也可以是其他形式,比如Nutch的Indexer,output時并不是去寫文件,而是調用Lucene的IndexWriter將作為中間數(shù)據(jù)集的Lucene Document存盤。

          ? 一段典型的Hadoop代碼:

          ??public?static?void?main(String[]?args)?main()
          ???{?
          ????JobConf?conf?
          =?new?JobConf(WordCount.class);
          ????conf.setJobName(
          "wordcount");???

          ????jobConf.setInputFormat(MyInputFormat.
          class);
          ????jobConf.setOutputFormat(MyOutputFormat.
          class);
          ???
          ????jobConf.setInputKeyClass(BytesWritable.
          class);
          ????jobConf.setInputValueClass(BytesWritable.
          class);
          ????jobConf.setOutputKeyClass(BytesWritable.
          class);
          ????jobConf.setOutputValueClass(BytesWritable.
          class);
          ????
          ????jobConf.setMapperClass(MyMapper.
          class);????????
          ????jobConf.setReducerClass(MyReducer.
          class);

          ????jobConf.setNumMapTasks(num_maps);
          ????jobConf.setNumReduceTasks(num_reduces);
          ????
          ????JobClient.runJob(jobConf);
          ???
          ???}

          ???? 這就是一段hadoop式程序的主代碼,用戶自行實現(xiàn)四個內部類,MyInputFormat,MyOutputFormat,MyMapper和MyReducer,然后一一在jobConf里配置,最后執(zhí)行runJob()即可。對比一下Nutch的源碼就知道,只要把原來一段順序執(zhí)行的代碼,拆分到上面四個類里面去,再在jobConf里進行指定,就可以擁有分布式執(zhí)行的能力,無須要處理分布式編程的代碼。配置一下服務器列表,在每臺服務器上執(zhí)行nutch/bin/start-all.sh,你的代碼就分布式地執(zhí)行了。

          ?? 最后看一下Hadoop的結構,除了MapReduce的分發(fā)外,還有兩個很重要的部分:

          ?? Hadoop的快速接口反射式RPC系統(tǒng):IPC。

          ?? Hadoop的分布式文件系統(tǒng)NDFS:見 CSharpProgrammer blog上的文章。

          ???注1:筆記中部分句子直接從網上文章摘錄,不一一聲明。

          ?? 注2:Hadoop 目前版本為0.5,還不夠成熟,看過源碼的Donald對其源碼評價一般,值得繼續(xù)等待。



          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1063315

          posted on 2006-09-15 11:05 放水老倌 閱讀(577) 評論(0)  編輯  收藏 所屬分類: J2EE
          主站蜘蛛池模板: 平遥县| 云和县| 扶绥县| 潼南县| 娱乐| 淅川县| 巴彦淖尔市| 华安县| 荣昌县| 泾阳县| 科尔| 盘锦市| 如东县| 阿荣旗| 土默特左旗| 双城市| 涡阳县| 黑龙江省| 太和县| 陈巴尔虎旗| 霍州市| 安国市| 鞍山市| 那曲县| 台山市| 龙岩市| 华池县| 崇信县| 象山县| 精河县| 石城县| 吴旗县| 宿迁市| 乡城县| 饶河县| 漳州市| 松滋市| 沙洋县| 南丹县| 麦盖提县| 祁东县|