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()方法传入
*/
@Override
public 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;
}
@Override
public void setConf(Configuration conf) {
this.conf = conf;
}
@Override
public Configuration getConf() {
return conf;
}
}
3. 编写Mapper、Reducer,和以前一样
4. 编写`WordCountDriver`驱动
```shell
package 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/
程序依然可以正常执行。