调用作业的区别
从和从调用mapreduce作业有什么区别?当我们说主类说,如果我们只是从main方法简单运行作业,我们得到的附加特权是什么, 我们没有的?谢谢。main()
ToolRunner.run()
MapReduce extends Configured implements Tool
从和从调用mapreduce作业有什么区别?当我们说主类说,如果我们只是从main方法简单运行作业,我们得到的附加特权是什么, 我们没有的?谢谢。main()
ToolRunner.run()
MapReduce extends Configured implements Tool
没有额外的权限,但您的命令行选项通过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
}
通过使用 ToolRunner.run(),任何 hadoop 应用程序都可以处理 hadoop 支持的标准命令行选项。ToolRunner在内部使用GenericOptionsParser。简而言之,命令行提供的hadoop特定选项被解析并设置为应用程序的配置对象。如果你只是使用main(),这不会自动发生。
例如。如果你说:
% hadoop MyHadoopApp -D mapred.reduce.tasks=3
然后会自动将对象中的值参数设置为 3。ToolRunner.run(new MyHadoopApp(), args)
mapred.reduce.tasks
Configuration
我们没有得到额外的特权。通常,人们不会在hadoop作业中简单地使用main()。使用 ToolRunner.run() 是一种标准做法。