日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Hadoop-- 海量文件的分布式計算處理方案 -江南白衣 -JavaEye技術(shù)社區(qū)

 yfmine 2007-04-10


    Hadoop 是Google MapReduce的一個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)了。
    1.基本概念:Hadoop的HDFS實現(xiàn)了google的GFS文件系統(tǒng),NameNode作為文件系統(tǒng)的負責調(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作為Mapper task 的輸入,生成Mapper task加入Queue。

    4.TaskTracker 向 JobTracker索求下一個Map/Reduce。
      
     Mapper Task先從InputFormat創(chuàng)建RecordReader,循環(huán)讀入FileSplits的內(nèi)容生成Key與Value,傳給Mapper函數(shù),處理完后中間結(jié)果寫成SequenceFile.
     Reducer Task 從運行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之上,詳見Scalable Computing with Hadoop。


    二、程序員編寫的代碼

    我們做一個簡單的分布式的Grep,簡單對輸入文件進行逐行的正則匹配,如果符合就將該行打印到輸出文件。因為是簡單的全部輸出,所以我們只要寫Mapper函數(shù),不用寫Reducer函數(shù),也不用定義Input/Output Format。

package  demo.hadoop

public
  class  HadoopGrep {

 
public   static   class  RegMapper  extends  MapReduceBase  implements  Mapper {

  
private  Pattern pattern;

  
public   void  configure(JobConf job) {
   pattern 
=  Pattern.compile(job.get( " mapred.mapper.regex " ));
  }

  
public   void  map(WritableComparable key, Writable value, OutputCollector output, Reporter reporter)
    
throws  IOException {
   String text 
=  ((Text) value).toString();
   Matcher matcher 
=  pattern.matcher(text);
   
if  (matcher.find()) {
    output.collect(key, value);
   }
  }
 }

 
private  HadoopGrep () {
 } 
//  singleton

 
public   static   void  main(String[] args)  throws  Exception {
  
  JobConf grepJob 
=   new  JobConf(HadoopGrep. class );
  grepJob.setJobName(
" grep-search " );
  grepJob.set(
" mapred.mapper.regex " , args[ 2 ]);

  grepJob.setInputPath(
new  Path(args[ 0 ]));
  grepJob.setOutputPath(
new  Path(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é)。


       三.運行Hadoop程序

        Hadoop這方面的文檔寫得不全面,綜合參考GettingStartedWithHadoop 與Nutch Hadoop Tutorial 兩篇后,再碰了很多釘子才終于完整的跑起來了,記錄如下:      

3.1 local運行模式

       完全不進行任何分布式計算,不動用任何namenode,datanode的做法,適合一開始做調(diào)試代碼。
       解壓hadoop,其中conf目錄是配置目錄,hadoop的配置文件在hadoop-default.xml,如果要修改配置,不是直接修改該文件,而是修改hadoop-site.xml,將該屬性在hadoop-site.xml里重新賦值。
       hadoop-default.xml的默認配置已經(jīng)是local運行,不用任何修改,配置目錄里唯一必須修改的是hadoop-env.sh 里JAVA_HOME的位置。


       將編譯好的HadoopGrep與RegMapper.class 放入hadoop/build/classes/demo/hadoop/目錄 找一個比較大的log文件放入一個目錄,然后運行

       hadoop / bin / hadoop demo.hadoop.HadoopGrep log文件所在目錄 任意的輸出目錄 grep的字符串


     查看輸出目錄的結(jié)果,查看hadoop/logs/里的運行日志。  
     在重新運行前,先刪掉輸出目錄。
 

3.2 單機集群運行模式

       現(xiàn)在來搞一下只有單機的集群.假設以完成3.1中的設置,本機名為hadoopserver
       第1步.    然后修改hadoop-site.xml ,加入如下內(nèi)容:

< property >
  
< name > fs.default.name </ name >
  
< value > hadoopserver:9000 </ value >
</ property >
< property >
  
< name > mapred.job.tracker </ name >
  
< value > hadoopserver:9001 </ value >
</ property >
< property >
  
< name > dfs.replication </ name >
  
< value > 1 </ value >
</ property >


    從此就將運行從local文件系統(tǒng)轉(zhuǎn)向了hadoop的hdfs系統(tǒng),mapreduce的jobtracker也從local的進程內(nèi)操作變成了分布式的任務系統(tǒng),9000,9001兩個端口號是隨便選擇的兩個空余端口號。
 
  另外,如果你的/tmp目錄不夠大,可能還要修改hadoop.tmp.dir屬性。


  第2步. 增加ssh不輸入密碼即可登陸。

    因為Hadoop需要不用輸入密碼的ssh來進行調(diào)度,在不su的狀態(tài)下,在自己的home目錄運行ssh-keygen -t rsa ,然后一路回車生成密鑰,再進入.ssh目錄,cp id_rsa.pub authorized_keys
    詳細可以man 一下ssh, 此時執(zhí)行ssh hadoopserver,不需要輸入任何密碼就能進入了。

  3.格式化namenode,執(zhí)行
  bin/hadoop namenode -format

  4.啟動Hadoop
     執(zhí)行hadoop/bin/start-all.sh, 在本機啟動namenode,datanode,jobtracker,tasktracker
 
  5.現(xiàn)在將待查找的log文件放入hdfs,。
     執(zhí)行hadoop/bin/hadoop dfs 可以看到它所支持的文件操作指令。
     執(zhí)行hadoop/bin/hadoop dfs put log文件所在目錄 in ,則log文件目錄已放入hdfs的/user/user-name/in 目錄中

  6.現(xiàn)在來執(zhí)行Grep操作
      hadoop/bin/hadoop demo.hadoop.HadoopGrep in out
      查看hadoop/logs/里的運行日志,重新執(zhí)行前。運行hadoop/bin/hadoop dfs rmr out 刪除out目錄。

  7.運行hadoop/bin/stop-all.sh 結(jié)束

  3.3 集群運行模式
  假設已執(zhí)行完3.2的配置,假設第2臺機器名是hadoopserver2
  1.創(chuàng)建與hadoopserver同樣的執(zhí)行用戶,將hadoop解壓到相同的目錄。

  2.同樣的修改haoop-env.sh中的JAVA_HOME 及修改與3.2同樣的hadoop-site.xml

  3. 將hadoopserver中的/home/username/.ssh/authorized_keys 復制到hadoopserver2,保證hadoopserver可以無需密碼登陸hadoopserver2
     scp /home/username/.ssh/authorized_keys  username@hadoopserver2:/home/username/.ssh/authorized_keys
 
  4.修改hadoop-server的hadoop/conf/slaves文件, 增加集群的節(jié)點,將localhost改為
    hadoop-server
    hadoop-server2

  5.在hadoop-server執(zhí)行hadoop/bin/start-all.sh
   將會在hadoop-server啟動namenode,datanode,jobtracker,tasktracker
   在hadoop-server2啟動datanode 和tasktracker
 
  6.現(xiàn)在來執(zhí)行Grep操作
     hadoop/bin/hadoop demo.hadoop.HadoopGrep in out
    重新執(zhí)行前,運行hadoop/bin/hadoop dfs rmr out 刪除out目錄

  7.運行hadoop/bin/stop-all.sh 結(jié)束。
   

四、效率

    經(jīng)測試,Hadoop并不是萬用靈丹,很取決于文件的大小和數(shù)量,處理的復雜度以及群集機器的數(shù)量,相連的帶寬,當以上四者并不大時,hadoop優(yōu)勢并不明顯。
    比如,不用hadoop用java寫的簡單grep函數(shù)處理100M的log文件只要4秒,用了hadoop local的方式運行是14秒,用了hadoop單機集群的方式是30秒,用雙機集群10M網(wǎng)口的話更慢,慢到不好意思說出來的地步。



    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多