Разница в названии работы

В чем разница между вызовом задания mapreduce из main() и из ToolRunner.run()? Когда мы говорим, что основной класс говорит, MapReduce extends Configured implements Tool, каковы дополнительные привилегии, которые мы получаем, которых у нас нет, если мы просто сделаем простой запуск задания из основного метода? Спасибо.

Ответы

Ответ 1

Нет никаких дополнительных привилегий, но параметры командной строки запускаются через GenericOptionsParser, что позволит вам извлечь определенные свойства конфигурации и настроить из него объект конфигурации:

http://hadoop.apache.org/common/docs/r0.20.2/api/org/apache/hadoop/util/GenericOptionsParser.html

В основном, скорее, для самостоятельного анализа некоторых параметров (с использованием индекса аргумента в списке), вы можете явно настроить свойства конфигурации из командной строки:

hadoop jar myJar.jar com.Main prop1value prop2value

public static void main(String args[]) {
    Configuration conf = new Configuration();
    conf.set("prop1", args[0]);
    conf.set("prop2", args[1]);

    conf.get("prop1"); // will resolve to "prop1Value"
    conf.get("prop2"); // will resolve to "prop2Value"
}

Становится намного сложнее с помощью ToolRunner:

hadoop jar myJar.jar com.Main -Dprop1=prop1value -Dprop2=prop2value

public int run(String args[]) {
    Configuration conf = getConf();

    conf.get("prop1"); // will resolve to "prop1Value"
    conf.get("prop2"); // will resolve to "prop2Value"
}

Одно последнее предупреждение: если вы используете метод конфигурации getConf(), сначала создайте свой объект Job, затем вытащите его конфигурацию - конструктор Job создает копию объекта Configruation, переданную в, поэтому, если вы вносите изменения в ссылка прошла, вы не увидите эти изменения:

public int run(String args[]) {
    Configuration conf = getConf();

    conf.set("prop3", "blah");

    Job job = new Job(conf); // job will have a deep copy of conf

    conf.set("prop4", "dummy"); // here we're amending the original conf

    job.getConfiguration().get("prop4"); // will resolve to null
}

Ответ 2

Используя ToolRunner.run(), любое приложение hadoop может обрабатывать стандартные параметры командной строки поддержанный hadoop. ToolRunner использует GenericOptionsParser внутренне. Короче говоря, специальные параметры hadoop, которые предоставляются командной строке, анализируются и устанавливаются в объект Configuration приложения. Если вы просто используете main(), это не произойдет автоматически.

например. Если вы скажете:

% hadoop MyHadoopApp -D mapred.reduce.tasks=3

Затем ToolRunner.run(new MyHadoopApp(), args) автоматически установит параметр значения mapred.reduce.tasks равным 3 в объекте Configuration.

НЕТ дополнительных привилегий, которые мы получаем. Обычно люди не используют просто main() в работе hadoop. Использование ToolRunner.run() - стандартная практика.