例如,我有一个Hadoop字数统计程序(来自互联网( , 字数统计.java:
public static class WordCount{
public static void main(String[] args)throws Exception{
....
Job job = Job.getInstance(new Configuration(), "word count");
job.setJarByClass(WordCount.class); //Why?
}
}
把它编译成一个罐子,然后像这样提交给纱线:
hadoop jar wordcount.jar WordCount [input-hdfs] [output-hdfs]
在此命令中,我们指定了:
(1( 罐子名称 (2( 类名
只要
Hadoop已经从它的命令行知道"WordCount"是wordcount.jar中的类名。
WordCount的公共类.java永远是WordCount,这是java标准,对吧?
那么打电话有什么意义
setJarByClass(WordCount.class)
在我看来这是多余的。为什么需要此声明?谢谢
您可以在单个 JAR 文件中有多个main
方法,因此类名是必需的,除非您将清单文件添加到 JAR。
而且你的job.set
类不需要与main
方法是同一个类,但Hadoop不能自动知道你想为作业运行哪个类,因此你也需要在代码中设置类
。不过,如果您确实想从 CLI 获取类,您可以做类似Class.forName(args[2])