Разница в вызове на работу - PullRequest
15 голосов
/ 25 марта 2012

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

Ответы [ 2 ]

24 голосов
/ 25 марта 2012

Никаких дополнительных привилегий нет, но параметры командной строки запускаются через 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"
}

Последнее слово предупреждения: при использовании метода Configuration 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
}
11 голосов
/ 25 марта 2012

Используя 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 () является стандартной практикой.

...