调用工作的区别

时间:2012-03-25 11:01:12

标签: java hadoop mapreduce

main()ToolRunner.run()调用mapreduce作业有什么区别?当我们说主要课程说MapReduce extends Configured implements Tool时,如果我们只是从main方法中简单地完成一项工作,那么我们得到的额外特权是什么呢?感谢。

2 个答案:

答案 0 :(得分:24)

没有额外的权限,但您的命令行选项可以通过GenericOptionsParser运行,这将允许您从中提取某些配置属性并配置Configuration对象:

http://hadoop.apache.org/common/docs/r0.20.2/api/org/apache/hadoop/util/GenericOptionsParser.html

基本上,自己解析一些选项(使用列表中参数的索引),您可以从命令行显式配置配置属性:

hadoop jar myJar.jar com.Main prop1value prop2value

public static void main(String args[]) {
    Configuration conf = new Configuration();
    conf.set("prop1", args[0]);
    conf.set("prop2", args[1]);

    conf.get("prop1"); // will resolve to "prop1Value"
    conf.get("prop2"); // will resolve to "prop2Value"
}

使用ToolRunner变得更加精简:

hadoop jar myJar.jar com.Main -Dprop1=prop1value -Dprop2=prop2value

public int run(String args[]) {
    Configuration conf = getConf();

    conf.get("prop1"); // will resolve to "prop1Value"
    conf.get("prop2"); // will resolve to "prop2Value"
}

最后一句警告:当使用Configuration方法getConf()时,首先创建Job对象,然后拉出它的Configuration - Job构造函数生成传入的Configruation对象的副本,所以如果你做了更改传入的引用,你的工作将不会看到这些变化:

public int run(String args[]) {
    Configuration conf = getConf();

    conf.set("prop3", "blah");

    Job job = new Job(conf); // job will have a deep copy of conf

    conf.set("prop4", "dummy"); // here we're amending the original conf

    job.getConfiguration().get("prop4"); // will resolve to null
}

答案 1 :(得分:11)

通过使用ToolRunner。run(),任何hadoop应用程序都可以处理hadoop支持的standard command line options。 ToolRunner在内部使用GenericOptionsParser。 简而言之,解析了提供命令行的hadoop特定选项并将其设置到应用程序的Configuration对象中。如果你只是使用main(),这不会自动发生。

例如。如果你说:

% hadoop MyHadoopApp -D mapred.reduce.tasks=3

然后ToolRunner.run(new MyHadoopApp(), args)会自动在mapred.reduce.tasks对象中将值参数Configuration设置为3。

我们没有额外的特权。通常人们不会在hadoop工作中使用main()。使用ToolRunner。run()是一种标准做法。