首页 > 解决方案 > hadoop用类名提交作业,为什么需要job.setJarByClass()?

问题描述

例如,我有一个 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?
    }
}

将其编译成 jar 并将其提交给 yarn,如下所示:

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)

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

标签: javaclasshadoopjobs

解决方案


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

而且你的job.set类不需要和main方法是同一个类,但是Hadoop不能自动知道你想为这个工作运行哪个类,因此你还需要在代码中设置类

Class.forName(args[2])不过,如果您确实想从 CLI 获取课程,您可以做类似的事情


推荐阅读