Mapreduce 是Hadoop上一個進行分布式數據運算和統計的框架,但是每次運行程序的時候都需要將程序打包並上傳的集群環境中運行,這就會讓程序的調試變得十分不方便。所以在這里寫下這篇博客和大家交流學習如何在本地調試Mapreduce程序。
本地是windows系統,文件路徑也是本地
首先需要將編譯后的windos放入解壓后的hadoop解壓包的bin目錄下,還有hadoop,dll文件不同版本的windows對應的winutils.exe是不同的。具體編譯方法,網上可以找到相關教程
這里就不詳說了。當然網上也有好心人編譯好的,來后就能用。
然后將hadoop的HADOOP_HOME配置到環境變量中去。在PATH中配置PATH=“%HADOOP—HOME\bin%”;
可能有些同學運行程序后仍會包報錯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程序在集群中運行時的大體流程: