Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 给工作打电话有什么不同_Java_Hadoop_Mapreduce - Fatal编程技术网

Java 给工作打电话有什么不同

Java 给工作打电话有什么不同,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,从main()调用mapreduce作业与从ToolRunner.run()调用mapreduce作业有何不同?当我们说主类说,MapReduce扩展了配置的实现工具,如果我们只是从主方法简单运行作业,我们所没有的额外特权是什么?谢谢。没有额外的特权,但是您的命令行选项可以通过GenericOptions Parser运行,这将允许您提取某些配置属性并从中配置配置配置对象: 基本上,您可以从命令行显式配置配置属性,而不是自己解析某些选项(使用列表中参数的索引): hadoop jar myJa

main()
调用mapreduce作业与从
ToolRunner.run()调用mapreduce作业有何不同?当我们说主类说,
MapReduce扩展了配置的实现工具
,如果我们只是从主方法简单运行作业,我们所没有的额外特权是什么?谢谢。

没有额外的特权,但是您的命令行选项可以通过GenericOptions Parser运行,这将允许您提取某些配置属性并从中配置配置配置对象:

基本上,您可以从命令行显式配置配置属性,而不是自己解析某些选项(使用列表中参数的索引):

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"
}
最后一点警告:当使用配置方法getConf()时,首先创建作业对象,然后拉出其配置-作业构造函数会复制传入的配置对象,因此如果对传入的引用进行更改,作业将看不到这些更改:

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(),任何hadoop应用程序都可以处理hadoop支持的事务。ToolRunner在内部使用。 简而言之,命令行提供的特定于hadoop的选项将被解析并设置到应用程序的对象中。如果只使用main(),这不会自动发生

如果你说:

% hadoop MyHadoopApp -D mapred.reduce.tasks=3
然后
ToolRunner.run(新的MyHadoopApp(),args)
将自动在
配置
对象中将值参数
mapred.reduce.tasks
设置为3


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

这是对代码的很好解释。我之前没有注意到几点,比如先创建Job对象,然后再获取它的配置,但现在它是有意义的。。