Mapreduce 是Hadoop上一个进行分布式数据运算和统计的框架,但是每次运行程序的时候都需要将程序打包并上传的集群环境中运行,这就会让程序的调试变得十分不方便。所以在这里写下这篇博客和大家交流学习如何在本地调试Mapreduce程序。
本地是windows系统,文件路径也是本地
首先需要将编译后的windos放入解压后的hadoop解压包的bin目录下,还有hadoop,dll文件不同版本的windows对应的winutils.exe是不同的。具体编译方法,网上可以找到相关教程
这里就不详说了。当然网上也有好心人编译好的,来后就能用。
然后将hadoop的HADOOP_HOME配置到环境变量中去。在PATH中配置PATH=“%HADOOP—HOMEin%”;
可能有些同学运行程序后仍会包报错NullPointException。需要将bin目录下的hadoop.dll考到C盘的system32下一份。
再次运行,非常好。
在本地运行需要配置两个参数
- conf.set("mapred.job.tracker", "local");
- conf.set("fs.default.name", "local");
其实这两个参数也可以不用配置,因为系统默认的就是本地
package worldcount; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WorldCountDrive { public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { Configuration conf = new Configuration(); /* conf.set("mapred.job.tracker", "local"); conf.set("fs.default.name", "local"); */ Job job = Job.getInstance(conf); job.setJarByClass(WorldCountDrive.class); job.setMapperClass(WorldcountMap.class); job.setReducerClass(WorldCountReduce.class); job.setMapOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.setInputPaths(job, new Path("C:/README.txt")); FileOutputFormat.setOutputPath(job, new Path("C:/output")); boolean res = job.waitForCompletion(true); System.exit(res?0:1); } }
这样我们写的mapreduce程序就可以在本地打断点进行调试了
log4j的配置
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
本地系统运行,文件系统用HDFS
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>
集群运行模式
(1)将mapreduce程序提交给yarn集群resourcemanager,分发到很多的节点上并发执行
(2)处理的数据和输出结果应该位于hdfs文件系统
(3)提交集群的实现步骤:
A、将程序打成JAR包,然后在集群的任意一个节点上用hadoop命令启动
$ hadoop jar wordcount.jar cn.itcast.bigdata.mrsimple.WordCountDriver inputpath outputpath
B、直接在linux的eclipse中运行main方法
(项目中要带参数:mapreduce.framework.name=yarn以及yarn的两个基本配置)
C、如果要在windows的eclipse中提交job给集群,则要修改YarnRunner类
mapreduce程序在集群中运行时的大体流程: