调用工作的区别

Rav*_*edi 15 java hadoop mapreduce

就是从调用MapReduce工作之间的区别main(),并从ToolRunner.run()?当我们说主要课程说,MapReduce extends Configured implements Tool如果我们只是从main方法中简单地完成工作,我们得到的额外特权是什么呢?谢谢.

Chr*_*ite 24

没有额外的权限,但您的命令行选项通过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"
}
Run Code Online (Sandbox Code Playgroud)

使用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"
}
Run Code Online (Sandbox Code Playgroud)

但最后一句警告是:当使用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
}
Run Code Online (Sandbox Code Playgroud)


Tej*_*til 11

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

例如.如果你说:

% hadoop MyHadoopApp -D mapred.reduce.tasks=3
Run Code Online (Sandbox Code Playgroud)

然后ToolRunner.run(new MyHadoopApp(), args)mapred.reduce.tasksConfiguration对象中自动将value参数设置为3 .

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