Yarn的Tool接口

作用


以我们上面配置好的公平调度器为例。
执行我们之前自己编写的WordCount程序:

  1. hadoop jar MapReduceDemo-1.0-SNAPSHOT.jar com.study.mapreduce.wordcount.WordCountDriver /input/ /output/

此时,程序可以正常执行,根据公平调度器配置的策略使用 root.tengyer.tengyer 调度器运行。

但是如果我们想要使用 -D mapreduce.job.queuename=root.test 指定使用其他调度器,就可能会出现问题。

  1. hadoop jar MapReduceDemo-1.0-SNAPSHOT.jar com.study.mapreduce.wordcount.WordCountDriver -D mapreduce.job.queuename=root.test /input/ /output/

因为我们自己编写的WordCount程序中,通过参数位置取的输出路径:

  1. FileInputFormat.setInputPaths(job, new Path(args[0]));
  2. FileOutputFormat.setOutputPath(job, new Path(args[1]));

加了-D参数后,shell的参数个数、位置发生了变化,args[0]args[1]获取的参数就变了,所以程序就报错了。

为了让自己编写的程序也可以动态修改参数,就可以使用 Yarn 的 Tool 接口。

案例

  1. 创建Maven项目,加入hadoop-client依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.apache.hadoop</groupId>
    4. <artifactId>hadoop-client</artifactId>
    5. <version>3.2.3</version>
    6. </dependency>
    7. </dependencies>
  2. 编写核心类,实现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;

  1. /**
  2. * 驱动。和以前的WordCountDriver几乎一样,区别就是Configuration不再是直接生成,而是通过setConf()方法传入
  3. */
  4. @Override
  5. public int run(String[] args) throws Exception {
  6. Job job = Job.getInstance(conf);
  7. job.setJarByClass(WordCountDriver.class);
  8. job.setMapperClass(WordCountMapper.class);
  9. job.setReducerClass(WordCountReducer.class);
  10. job.setMapOutputKeyClass(Text.class);
  11. job.setMapOutputValueClass(IntWritable.class);
  12. job.setOutputKeyClass(Text.class);
  13. job.setOutputValueClass(IntWritable.class);
  14. FileInputFormat.setInputPaths(job, new Path(args[0]));
  15. FileOutputFormat.setOutputPath(job, new Path(args[1]));
  16. return job.waitForCompletion(true) ? 0 : 1;
  17. }
  18. @Override
  19. public void setConf(Configuration conf) {
  20. this.conf = conf;
  21. }
  22. @Override
  23. public Configuration getConf() {
  24. return conf;
  25. }

}

  1. 3. 编写MapperReducer,和以前一样
  2. 4. 编写`WordCountDriver`驱动
  3. ```shell
  4. package com.study.yarn;
  5. import org.apache.hadoop.conf.Configuration;
  6. import org.apache.hadoop.util.Tool;
  7. import org.apache.hadoop.util.ToolRunner;
  8. public class WordCountDriver {
  9. public static void main(String[] args) throws Exception{
  10. // 创建配置信息
  11. Configuration conf = new Configuration();
  12. // 使用ToolRunner进行运行。
  13. // ToolRunner会将args中的-D参数进行转换,将剩余的参数作为args送到run方法。
  14. Tool tool = new WordCount();
  15. ToolRunner.run(conf, tool, args);
  16. }
  17. }
  1. 执行maven的package打包

将打包好的jar包上传到hadoop服务器。

首先使用正常的不传入-D参数的命令进行测试:

  1. hadoop jar YarnDemo-1.0-SNAPSHOT.jar com.study.yarn.WordCountDriver /input/ /output/

程序可以正常执行。

然后在中间加入 -D 参数再进行测试:

  1. hadoop jar YarnDemo-1.0-SNAPSHOT.jar com.study.yarn.WordCountDriver -D mapreduce.job.queuename=root.test /input/ /output/

程序依然可以正常执行。