hadoop使用类名提交作业,为什么job.setJarByClass()是必需的?

时间:2018-08-25 05:39:51

标签: java class hadoop jobs

例如我有一个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)类名称

只要

  1. hadoop已经从其命令行“ WordCount”知道了wordcount.jar中的类名。

  2. WordCount.java的公共类始终是WordCount,这是Java标准,对吧?

那叫什么意思

setJarByClass(WordCount.class)

在我看来,这是多余的。为什么需要此声明?谢谢

1 个答案:

答案 0 :(得分:1)

单个JAR文件中可以有多个main方法,因此,除非将清单文件添加到JAR中,否则类名是必需的。

您的job.set类不需要与main方法是同一类,但是Hadoop无法自动知道您要为工作运行哪个类,因此您需要在代码中同时设置类

如果您确实想从CLI获取类,则可以执行类似Class.forName(args[2])的操作