2012-03-25 36 views
15

調用mapreduce工作從main()ToolRunner.run()之間有什麼區別?當我們說主類說MapReduce extends Configured implements Tool時,我們得到的額外特權是什麼,如果我們只是從主方法中簡單地執行一項工作,我們就沒有什麼特權了?謝謝。調用工作區別

回答

23

有沒有額外的特權,但你的命令行選項獲得通過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" 
} 

成爲更多mor Ë縮合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()時,先創建工作對象,然後將它配置了 - 作業構造使得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 
} 
+0

那麼,這是與代碼很好的解釋。我早先沒有注意到幾點,比如先創建Job對象,然後得到它的配置,但現在有意義.. – 2012-03-25 15:14:39

11

通過使用ToolRunner .RUN(),任何Hadoop的應用程序可以處理standard command line options通過Hadoop的支持。 ToolRunner內部使用GenericOptionsParser。 簡而言之,分析提供命令行的hadoop特定選項並將其設置到應用程序的Configuration對象中。如果你只是使用main(),這不會自動發生。

例如。如果你說:

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

然後ToolRunner.run(new MyHadoopApp(), args)會自動值參數mapred.reduce.tasksConfiguration對象設置爲3。

我們沒有額外的特權。通常人們不會在hadoop作業中簡單地使用main()。使用ToolRunner .run()是一種標準做法。

+0

@ TejasP-非常感謝! :)是啊,我腦子裏有這麼模糊的想法,但現在清楚了.. – 2012-03-25 15:06:32