例如我有一个Hadoop单词计数程序(来自互联网) ,WordCount.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)jar名称(2)类名称
只要
hadoop已经从其命令行“ WordCount”知道了wordcount.jar中的类名。
WordCount.java的公共类始终是WordCount,这是Java标准,对吧?
那叫什么意思
setJarByClass(WordCount.class)
在我看来,这是多余的。为什么需要此声明?谢谢
答案 0 :(得分:1)
单个JAR文件中可以有多个main
方法,因此,除非将清单文件添加到JAR中,否则类名是必需的。
您的job.set
类不需要与main
方法是同一类,但是Hadoop无法自动知道您要为工作运行哪个类,因此您需要在代码中同时设置类
如果您确实想从CLI获取类,则可以执行类似Class.forName(args[2])
的操作