Hadoop отправляет задание с именем класса, зачем нужен job.setJarByClass ()? - PullRequest
0 голосов
/ 25 августа 2018

Например, у меня есть программа подсчета слов 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) имя фляги (2) имя класса

Пока

  1. hadoopИз командной строки уже известно, что «WordCount» - это имя класса из wordcount.jar.

  2. Общедоступным классом WordCount.java всегда является WordCount, это стандарт Java, верно?

Тогда какой смысл вызывать

setJarByClass(WordCount.class)

Мне кажется это излишним.Почему требуется это утверждение?Спасибо

1 Ответ

0 голосов
/ 25 августа 2018

В одном файле JAR может быть несколько методов main, поэтому имя класса необходимо, если вы не добавите файл манифеста в JAR.

И ваш job.set класс не обязательно должен быть тем же классом с методом main, но Hadoop не может автоматически определить, какой класс вы хотите запустить для задания, поэтому вам нужно установить класс в коде также

Вы можете сделать что-то вроде Class.forName(args[2]), если хотите получить класс из CLI, хотя

...