Hadoop Mapreduce本地調試

       Mapreduce 是Hadoop上一個進行分佈式數據運算和統計的框架,但是每次運行程序的時候都需要將程序打包並上傳的集羣環境中運行,這就會讓程序的調試變得十分不方便。所以在這裏寫下這篇博客和大家交流學習如何在本地調試Mapreduce程序。


       我的本地開發環境是Mac10.11.4, Hadoop 2.6.4, 集羣操作系統是centos6.7


MapReduce的本地調試方式:

       1. Mapreduce運行在Mac系統本地,不用做任何更改,因爲hadoop-client的jar包中的core等配置文件默認的就是local,輸入輸出目錄使用Mac本地的路徑就可以

                      Mapreduce程序中main方法代碼片段         
          Configuration conf = new Configuration();
          Job job = Job.getInstance(conf);
          ………………
          FileInputFormat.setInputPaths(job, new Path("/Users/admin/Desktop/Telephone_Summary"));  
          FileOutputFormat.setOutputPath(job, new Path("/Users/admin/Desktop/mapreduceTestOutput3"));</span>



   2.Mapreduce運行在Mac系統本地,也可以通過手動配置系統參數實現,輸入輸出目錄使用Mac本地的路徑就可以
               
           Mapreduce程序中main方法代碼片段     
         conf.set("mapred.job.tracker", "local");
         conf.set("fs.default.name", "local");    
          ………………
         FileInputFormat.setInputPaths(job, new Path("/Users/admin/Desktop/Telephone_Summary"));  
         FileOutputFormat.setOutputPath(job, new Path("/Users/admin/Desktop/mapreduceTestOutput3"));



  3.Mapreduce運行在Mac系統本地,輸入輸出的文件系統使用線上的hdfs文件系統,同時輸入輸出目錄使用線上的hdfs文件系統的路徑
 
     注意如果MAC本機的用戶名和服務器上啓動hadoop的用戶的用戶名不一致,會因爲權限問題而無法寫入hdfs文件系統,需要手動改hdfs上的權限或者修改MAC上去連hdfs的用戶的用戶名!或者修改hdfs上的文件權限!     
           a.    將 conf/hdfs-site.xml中的dfs.permissions屬性修改爲false。
           b.   修改該目錄的訪問權限 命令如下 :$ hadoop fs -chmod 777
         c.   也是最常用的做法,在eclipse中配置mapreduce的java運行參數 -DHADOOP_USER_NAME=root

     Mapreduce程序中main方法代碼片段 
     conf.set("mapred.job.tracker", "local");
     conf.set("fs.defaultFS", "hdfs://Hadoop:9000");
     ………………
     FileInputFormat.setInputPaths(job, new Path("/Users/admin/Telephone_Summary")); //hdfs的文件路徑  
     FileOutputFormat.setOutputPath(job, new Path("/Users/admin/mapreduceTestOutput"));//hdfs的文件路徑</span>


      4. Mac系統本地將mapreduce提交給集羣中的yarn去協調運行並本地調試,輸入輸出的文件系統使用線上的hdfs文件系統,輸入輸出目錄使用線上的hdfs文件系統的路徑

這裏有幾個參數要重點注意:
   (1)在mac系統上必須設置yarn的resourcemanager在集羣上的ip地址,conf.set("yarn.resourcemanager.address","172.16.124.130:8032");不然默認會調用0.0.0.0:8032地址,調試信息中就會出現下面連接不上yarn集羣的提示
pc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 6 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
     
     (2)需要下載Hadoop的項目比解壓在Mac系統中,並在你的mapreduce程序的main方法中設置hadoop的項目目錄, System.setProperty("hadoop.home.dir","/Users/admin/Downloads/systemSoftware/Linux/hadoop-2.6.4");不然會報如下錯誤信息:
DEBUG util.Shell: Failed to detect a valid hadoop home directory
java.io.IOException: HADOOP_HOME or hadoop.home.dir are not set.
    因爲程序在向集羣中的yarn請求時,需要本地運行hadoop項目並獲取一些參數並進行設置。相比之下,如果是要在某些版本的Windows系統上進行本地調試,並向集羣上yarn發請求,會因爲hadoop項目在windows上運行環境的問題,以及windows中參數格式和linux系統參數不同等問題,需要做出一些調整,比如在windows系統上重新對hadoop項目的源碼進行編譯以及將YarnRunner類中生成的系統參數從windows的格式修改linux的格式等。
         
         (3)設置job.setJar("/Users/admin/Desktop/hadoopBasic.jar”);指明提交給yarn的mapreduce程序的jar包路徑,需要注意的是這個mapreduce程序的jar包路徑是在本地Mac系統上的路徑
         
        Mapreduce程序中main方法代碼片段
         conf.set("mapred.job.tracker","local");
         conf.set("fs.defaultFS", "hdfs://Hadoop:9000");  
         conf.set("mapreduce.framework.name", "yarn");
         conf.set("yarn.resoucemanager.hostname", "Hadoop"); 
         conf.set("yarn.resourcemanager.address", "172.16.124.130:8032");
         System.setProperty("hadoop.home.dir","/Users/admin/Downloads/systemSoftware/Linux/hadoop-2.6.4");
         Job job = Job.getInstance(conf); 
         job.setJar("/Users/admin/Desktop/hadoopBasic.jar");
         ………………
         FileInputFormat.setInputPaths(job, new Path("/Users/admin/Telephone_Summary"));   
         FileOutputFormat.setOutputPath(job, new Path("/Users/admin/mapreduceTestOutput"));</span>


Mapreduce本地調試時log4j打印調試信息的方法
將log4j.properties文件放在java的src目錄下。
log4j.properties文件內容:
hadoop.root.logger=DEBUG, console
log4j.rootLogger = DEBUG, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章