Hadoop Mapreduce本地调试

Posted 咕噜大大

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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=%dyy/MM/dd HH:mm:ss %p %c2: %m%n

 

以上是关于Hadoop Mapreduce本地调试的主要内容,如果未能解决你的问题,请参考以下文章

测试项目:本地hadoop环境使用IDEA创建mapreduce项目及调试

如何从 Eclipse 调试 hadoop mapreduce 作业?

windows下在eclipse上远程连接hadoop集群调试mapreduce错误记录

老师,IDEA如何在本地运行和调试Hadoop程序?

window本地运行mapreduce程序

本地idea开发mapreduce程序提交到远程hadoop集群执行