调用工作的差异

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

没有额外的权限,但您的命令行选项通过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 } 

通过使用ToolRunner .run(),任何hadoop应用程序都可以处理hadoop支持的标准命令行选项 。 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()是一种标准做法。