一尘不染

称职的区别

java

main()和从调用mapreduce作业有什么区别ToolRunner.run()?当我们说主类说时,MapReduce extends Configured implements Tool如果仅通过main方法对作业进行简单的操作,我们将获得哪些额外的特权呢?谢谢。


阅读 450

收藏
2020-12-03

共1个答案

一尘不染

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

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

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

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
}
2020-12-03