9

大多数 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什么?As Tooland Configuredboth have getConf()and setConf()in common。它为我们的应用程序提供了什么?

4

2 回答 2

11

Configured是接口的实现类ConfigurableConfigured是具有 和 实现的基getConf()setConf()

仅扩展此基类就可以使用 a 配置扩展此基类的类,Configuration并且Configuration.

当您的代码执行以下行时,

ToolRunner.run(new MyApp(), args);

在内部它会这样做

ToolRunner.run(tool.getConf(), tool, args);

在上述情况下toolMyApp类实例,它是一个实现,Tool正如你所说的那样,getConf()但它只是一个接口。实现来自Configured基类。如果你避免Configured在上面的代码中扩展类,那么你将不得不自己做getConf()setConf()实现。

于 2013-01-03T11:52:19.293 回答
3

ConfiguredConfigurable接口的默认实现 - 基本上它的setConf方法为传递的Configuration对象保留一个私有实例变量并getConf()返回该引用

ToolConfigurable接口的扩展,提供添加run(..)方法,用于ToolRunner解析命令行选项(使用GenericOptionsParser)并构建一个Configuration对象,然后将其传递给该setConf(..)方法。

您的主类通常会扩展 Configured,以便为您实现 Tool 中所需的 Configurable 接口方法。

一般来说,您应该使用 ToolRunner 实用程序类来启动 MapReduce 作业,因为它处理解析命令行参数和构建配置对象的常见任务。我会查看 ToolRunner 的 API Docs 以获取更多信息。

于 2013-01-03T11:51:38.497 回答