1、模板代码,只要替换成自己写的Mapper和Reducer等等就行了
public static void main(String[] args) throws Exception{
int exit = ToolRunner.run(new Configuration(), new WCRunner(), args);
System.exit(exit);
}
@Override
public int run(String[] strings) throws Exception{
//hdfs操作文件系统的用户名,避免在windows下使用默认用户名对hdfs没有修改权限
System.setProperty("HADOOP_USER_NAME", "root");
Configuration conf = new Configuration();
//namenode返回远程datanode主机的主机名,而不使用内网ip,
//并且需要配置当前代码运行到的所有主机的hosts文件,
//把namenode返回的主机名与对应主机ip的映射写好。。有钱的话可以用域名
conf.set("dfs.client.use.datanode.hostname", "true");
Job job = Job.getInstance(conf);
//设置当前mapreduce程序的jar包所在路径,运行runjar时会把该路径的jar包上传至resourceManager指定的路径下
//与下面的setJarByClass是设置一样的属性,不过看了源码之后了解到:
//下面setJarByClass虽然同样会设置mapreduce.job.jar属性,但在windows本地用idea直接run运行时,setJarByClass方式是拿不到jar包的路径的,
//如果拿不到,那么就不会去设置mapreduce.job.jar属性
//所以在本地运行时,生效的设置是这一行。setJarByClass会无效。。所以这一行可以自己设置自己导出的本地jar包所在路径
conf.set("mapreduce.job.jar","C:\\Users\\周利东\\.m2\\repository\\com\\example\\hadoop\\0.0.1-SNAPSHOT\\hadoop-0.0.1-SNAPSHOT.jar");
//根据指定的class找到该类所属的jar包路径。
//设置当前mapreduce程序的jar包所在路径,运行runjar时会把该jar包上传至resourceManager指定的路径下
//如果找不到jar包路径(在本地用编译器直接run就可能找不到),则不会设置mapreduce.job.jar。。如果找到了jar包路径(使用hadoop jar xxx.jar方式运行),则会设置mapreduce.job.jar,即把前面的给覆盖掉。
job.setJarByClass(WCRunner.class);
//指定当前作业执行的Mapper与Reducer
job.setMapperClass(WCMapper.class);
job.setReducerClass(WCReduce.class);
//指定Mapper与Reducer输出的key-value类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
//执行Mapper输出的key-value类型
//可以覆盖上面的,这样的话就相当于上面两行是指定Reducer的输出kv类型
//而下面两行是指定Mapper的输出kv类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
//指定输入数据存放在hdfs的目录,只要指定目录就行,到时候会读取整个目录下的所有文件
FileInputFormat.setInputPaths(job, new Path("/wc/srcData"));
Path path = new Path("/wc/output");
FileSystem fileSystem = FileSystem.get(conf);
if (fileSystem.exists(path)){
fileSystem.delete(path,true );
}
//指定处理结果输出数据存放在hdfs的目录
FileOutputFormat.setOutputPath(job,path );
return job.waitForCompletion(true)?0:1;
}
2、把项目打成jar包,然后丢到hadoop集群里面运行就行了。
运行命令格式:hadoop jar jar包名 主类全限定名
其中,主类指的是你要运行的main方法所处的类。
比如上面的代码中main方法在WCRunner中,所以使用命令:hadoop jar xxx.jar com.example.xx.xx.WCRunner
3、需要注意,数据输出的最低的那一层目录不要自己创建,mapreduce会创建,如果已经存在那个输出目,运行时会抛异常,提示你那个输出目录已经存在。