大多数Hadoop MapReduce程序都是这样的:
public class MyApp extends Configured Implements Tool {
@Override
public int run(String[] args) throws Exception {
Job job = new Job(getConf());
/* process command line options */
return job.waitForCompletion(true) ? 0 : 1;
}
public static void main(String[] args) throws Exception {
int exitCode = ToolRunner.run(new MyApp(), args);
System.exit(exitCode);
}
}
Configured
的用法是什么?由于Tool
和Configured
共有getConf()
和setConf()
。它为我们的应用程序提供了什么?
答案 0 :(得分:10)
Configured
是接口Configurable
的实现类。 Configured
是具有getConf()
和setConf()
实现的基类。
仅仅扩展此基类,可以使用Configuration
配置扩展此基类的类,并且Configuration
有多个实现。
当您的代码执行以下行时,
ToolRunner.run(new MyApp(), args);
在内部,它会这样做
ToolRunner.run(tool.getConf(), tool, args);
在上面的例子中,tool
是MyApp
类实例,它是Tool
的一个实现,就像你说的getConf()
一样,但它只是一个接口。实现来自Configured
基类。如果您避免在上面的代码中扩展Configured
类,那么您必须自己执行getConf()
和setConf()
实现。
答案 1 :(得分:3)
Configured
是Configurable
接口的默认实现 - 基本上它的setConf
方法保留了传递的Configuration
对象的私有实例变量,并且getConf()
返回那个参考
Tool
是Configurable
接口的扩展,提供了一个附加run(..)
方法,并与ToolRunner
一起用于解析命令行选项(使用{{3}然后构建一个Configuration
对象,然后传递给setConf(..)
方法。
您的主类通常会扩展为Configured,以便为您实现Tool中所需的可配置接口方法。
通常,您应该使用ToolRunner实用程序类来启动MapReduce作业,因为它处理解析命令行参数和构建Configuration对象的常见任务。我将查看ToolRunner的API文档以获取更多信息。