从 main()
和从 ToolRunner.run()
调用 mapreduce 作业有什么区别?当我们说主类说 MapReduce extends Configured implements Tool
时,如果我们只是从 main 方法简单地运行作业,我们得到的额外特权是什么? ?谢谢。
最佳答案
没有额外的权限,但您的命令行选项通过 GenericOptionsParser 运行,这将允许您提取某些配置属性并从中配置配置对象:
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
}
关于java - 调用作业的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9859652/