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