Yarn的Tool接口
作用
以我们上面配置好的公平调度器为例。
执行我们之前自己编写的WordCount程序:
hadoop jar MapReduceDemo-1.0-SNAPSHOT.jar com.study.mapreduce.wordcount.WordCountDriver /input/ /output/
此时,程序可以正常执行,根据公平调度器配置的策略使用 root.tengyer.tengyer 调度器运行。
但是如果我们想要使用 -D mapreduce.job.queuename=root.test 指定使用其他调度器,就可能会出现问题。
hadoop jar MapReduceDemo-1.0-SNAPSHOT.jar com.study.mapreduce.wordcount.WordCountDriver -D mapreduce.job.queuename=root.test /input/ /output/
因为我们自己编写的WordCount程序中,通过参数位置取的输出路径:
FileInputFormat.setInputPaths(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));
加了-D参数后,shell的参数个数、位置发生了变化,args[0]、args[1]获取的参数就变了,所以程序就报错了。
为了让自己编写的程序也可以动态修改参数,就可以使用 Yarn 的 Tool 接口。
案例
创建Maven项目,加入
hadoop-client依赖<dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.2.3</version></dependency></dependencies>
编写核心类,实现
Tool接口 ```shell package com.study.yarn;
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; import org.apache.hadoop.util.Tool;
public class WordCount implements Tool { private Configuration conf;
/*** 驱动。和以前的WordCountDriver几乎一样,区别就是Configuration不再是直接生成,而是通过setConf()方法传入*/@Overridepublic int run(String[] args) throws Exception {Job job = Job.getInstance(conf);job.setJarByClass(WordCountDriver.class);job.setMapperClass(WordCountMapper.class);job.setReducerClass(WordCountReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.setInputPaths(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));return job.waitForCompletion(true) ? 0 : 1;}@Overridepublic void setConf(Configuration conf) {this.conf = conf;}@Overridepublic Configuration getConf() {return conf;}
}
3. 编写Mapper、Reducer,和以前一样4. 编写`WordCountDriver`驱动```shellpackage com.study.yarn;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.util.Tool;import org.apache.hadoop.util.ToolRunner;public class WordCountDriver {public static void main(String[] args) throws Exception{// 创建配置信息Configuration conf = new Configuration();// 使用ToolRunner进行运行。// ToolRunner会将args中的-D参数进行转换,将剩余的参数作为args送到run方法。Tool tool = new WordCount();ToolRunner.run(conf, tool, args);}}
- 执行maven的
package打包
将打包好的jar包上传到hadoop服务器。
首先使用正常的不传入-D参数的命令进行测试:
hadoop jar YarnDemo-1.0-SNAPSHOT.jar com.study.yarn.WordCountDriver /input/ /output/
程序可以正常执行。
然后在中间加入 -D 参数再进行测试:
hadoop jar YarnDemo-1.0-SNAPSHOT.jar com.study.yarn.WordCountDriver -D mapreduce.job.queuename=root.test /input/ /output/
程序依然可以正常执行。
