<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    hengheng123456789

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      297 Posts :: 68 Stories :: 144 Comments :: 0 Trackbacks
    轉自:http://hi.baidu.com/webcell/blog/item/2154b1015874bf0a728da5a0.html

    Hadoop 是Google MapReduce 的一個Java實現。MapReduce是一種簡化的分布式編程模式,讓程序自動分布到一個由普通機器組成的超大集群上并發執行。就如同java程序員可以不考慮內存泄露一樣, MapReduce的run-time系統會解決輸入數據的分布細節,跨越機器集群的程序執行調度,處理機器的失效,并且管理機器之間的通訊請求。這樣的模式允許程序員可以不需要有什么并發處理或者分布式系統的經驗,就可以處理超大的分布式系統得資源。

        一、概論

        作為Hadoop程序員,他要做的事情就是:
        1、定義Mapper,處理輸入的Key-Value對,輸出中間結果。
        2、定義Reducer,可選,對中間結果進行規約,輸出最終結果。
        3、定義InputFormat 和OutputFormat,可選,InputFormat將每行輸入文件的內容轉換為Java類供Mapper函數使用,不定義時默認為String。
        4、定義main函數,在里面定義一個Job并運行它。

        然后的事情就交給系統了。
        1.基本概念:Hadoop的HDFS實現了google的GFS文件系統,NameNode作為文件系統的負責調度運行在master,DataNode運行在每個機器上。同時Hadoop實現了Google的MapReduce,JobTracker作為MapReduce的總調度運行在master,TaskTracker則運行在每個機器上執行Task。

        2.main()函數,創建JobConf,定義Mapper,Reducer,Input/OutputFormat 和輸入輸出文件目錄,最后把Job提交給JobTracker,等待Job結束。

        3.JobTracker,創建一個InputFormat的實例,調用它的getSplits()方法,把輸入目錄的文件拆分成FileSplist作為Mapper task 的輸入,生成Mapper task加入Queue。

        4.TaskTracker 向 JobTracker索求下一個Map/Reduce。
          
          Mapper Task先從InputFormat創建RecordReader,循環讀入FileSplits的內容生成Key與Value,傳給Mapper函數,處理完后中間結果寫成SequenceFile.
          Reducer Task 從運行Mapper的TaskTracker的Jetty上使用http協議獲取所需的中間內容(33%),Sort/Merge后(66%),執行Reducer函數,最后按照OutputFormat寫入結果目錄。

          TaskTracker 每10秒向JobTracker報告一次運行情況,每完成一個Task10秒后,就會向JobTracker索求下一個Task。

          Nutch項目的全部數據處理都構建在Hadoop之上,詳見Scalable Computing with Hadoop 。


        二、程序員編寫的代碼

        我們做一個簡單的分布式的Grep,簡單對輸入文件進行逐行的正則匹配,如果符合就將該行打印到輸出文件。因為是簡單的全部輸出,所以我們只要寫Mapper函數,不用寫Reducer函數,也不用定義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()函數接受由main函數傳入的查找字符串,map() 函數進行正則匹配,key是行數,value是文件行的內容,符合的文件行放入中間結果。
            main()函數定義由命令行參數傳入的輸入輸出目錄和匹配字符串,Mapper函數為RegMapper類,Reduce函數是什么都不做,直接把中間結果輸出到最終結果的的IdentityReducer類,運行Job。


            整個代碼非常簡單,絲毫沒有分布式編程的任何細節。


           三.運行Hadoop程序

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

    3.1 local運行模式

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


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

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


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

    3.2 單機集群運行模式

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

    < 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文件系統轉向了hadoop的hdfs系統,mapreduce的jobtracker也從local的進程內操作變成了分布式的任務系統,9000,9001兩個端口號是隨便選擇的兩個空余端口號。

    另外,如果你的/tmp目錄不夠大,可能還要修改hadoop.tmp.dir屬性。


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

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

    3.格式化namenode,執行
       bin/hadoop namenode -format

    4.啟動Hadoop
         執行hadoop/bin/start-all.sh, 在本機啟動namenode,datanode,jobtracker,tasktracker

    5.現在將待查找的log文件放入hdfs,。
          執行hadoop/bin/hadoop dfs 可以看到它所支持的文件操作指令。
          執行hadoop/bin/hadoop dfs put log文件所在目錄 in ,則log文件目錄已放入hdfs的/user/user-name/in 目錄中

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

    7.運行hadoop/bin/stop-all.sh 結束

    3.3 集群運行模式
    假設已執行完3.2的配置,假設第2臺機器名是hadoopserver2
    1.創建與hadoopserver同樣的執行用戶,將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文件, 增加集群的節點,將localhost改為
        hadoop-server
        hadoop-server2

    5.在hadoop-server執行hadoop/bin/start-all.sh
       將會在hadoop-server啟動namenode,datanode,jobtracker,tasktracker
       在hadoop-server2啟動datanode 和tasktracker

    6.現在來執行Grep操作
         hadoop/bin/hadoop demo.hadoop.HadoopGrep in out
        重新執行前,運行hadoop/bin/hadoop dfs rmr out 刪除out目錄

    7.運行hadoop/bin/stop-all.sh 結束。

    四、效率

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

    posted on 2010-12-24 16:25 哼哼 閱讀(414) 評論(0)  編輯  收藏 所屬分類:
    主站蜘蛛池模板: 久草在视频免费福利| a级亚洲片精品久久久久久久| 久热综合在线亚洲精品| 麻豆亚洲AV成人无码久久精品 | 色妞WWW精品免费视频| 日本亚洲成高清一区二区三区| 亚洲AV色无码乱码在线观看 | 国产公开免费人成视频| 亚洲资源在线视频| 三级网站在线免费观看| 四虎永久免费地址在线网站| 亚洲国产精品白丝在线观看| 国产在线精品观看免费观看| 国产一区二区三区在线观看免费 | 91免费在线视频| 四虎永久免费网站免费观看| 亚洲一区动漫卡通在线播放| 免费无码又爽又刺激高潮视频| 国产精品亚洲综合一区| 国产精品亚洲精品久久精品 | 妞干网在线免费视频| 亚洲日本在线观看网址| 曰批全过程免费视频在线观看无码 | 国产偷国产偷亚洲高清人| 成人性生交大片免费看无遮挡 | 超pen个人视频国产免费观看| 亚洲国产夜色在线观看| 无码av免费一区二区三区| 亚洲精品无码专区在线在线播放| 人碰人碰人成人免费视频| 国产精品高清全国免费观看| 亚洲成a人片在线观看天堂无码 | 亚洲乱码中文论理电影| 5555在线播放免费播放| 又大又硬又粗又黄的视频免费看| 日本高清免费不卡视频| 亚洲依依成人亚洲社区| 啦啦啦高清视频在线观看免费| 亚洲免费电影网站| 中文字幕无码播放免费| 亚洲国产精品午夜电影|