本文提到的类均是hadoop框架中的。
官方文档提到:
ToolRunner can be used to run classes implementing Tool interface
ToolRunder 是用来运行实现了Tool接口的类,那么实现了Tool接口的类能做到什么?
Tool 接口继承了Configurable 接口,换言之,实现Tool必须实现三个接口:
public class AnalysisTool implements Tool {
@Override
public int run(String[] args) throws Exception {
return 0;
}
@Override
public void setConf(Configuration conf) {
}
@Override
public Configuration getConf() {
return null;
}
}
代码中,run方法 表示给定参数并执行对应的MR应用。后两个方法当然就是设定和获取配置参数(不设置也会新建)。所以不难想象,一个MR应用应该是由Tool加载配置文件并最终执行的。所以官方文档提到:
Tool, is the standard for any Map-Reduce tool/application. The tool/application should delegate the handling of standard command-line options to ToolRunner.run(Tool, String[]) and only handle its custom arguments.
即,Tool规范了MR应用。后边一句话又提到MR应用将标准命令行参数的处理交由ToolRunner.run(Tool, String[])来处理。这里是指,运行MR程序和配置文件都应该由ToolRunner来执行。即,ToolRunnder是运行MR程序(Tool封装的)的官方标准。
简单总结一下:一个MR应用应由ToolRunner的调用Tool实现类完成,期间需要加载配置文件。
可能有人会问?这样和直接使用main方法执行有什么区别?
实际上ToolRunner执行的应用可以接受hadoop标准命令行参数 比如 hadoop MyHadoopApp -D mapred.reduce.tasks=3 ,这样显然就会更灵活/标准。而非标准的参数,比如输入输出路径,会传入到run方法的args中,以供开发者自己使用。
最终,如果你不用标准命令行参数的配置。可能看起来似乎两种方式没什么区别。但那并是说ToolRunner没有优点。
扩展
以下是ToolRunner方法的部分源码实现,可以看出:
-
会自动新建配置对象
-
会将传入的参数整合在一起(符合标准的)
-
将剩余的参数(输入输出路径等)作为run方法的参数传给实现类
if(conf == null) {
conf = new Configuration();
}
GenericOptionsParser parser = new GenericOptionsParser(conf, args);
//set the configuration back, so that Tool can configure itself
tool.setConf(conf);
//get the args w/o generic hadoop args
String[] toolArgs = parser.getRemainingArgs();
return tool.run(toolArgs);









网友评论