mapreduce 輔助類GenericOptionsParser,Tool和ToolRunner

輔助類GenericOptionsParser,Tool和ToolRunner

爲了簡化命令行方式運行作業,Hadoop自帶了一些輔助類。GenericOptionsParser是一個類,用來解釋常用的Hadoop命令行選項,並根據需要,爲Configuration對象設置相應的取值。通常不直接使用GenericOptionsParser,更方便的方式是:實現Tool接口,通過ToolRunner來運行應用程序,ToolRunner內部調用GenericOptionsParser:

  1. GenericOptionsParser:  
  2. public interface Tool extends Configurable {  
  3.   int run(String [] args) throws Exception;  
  4. }  

例5-3給出了一個非常簡單的Tool的實現,用來打印Tool的Configuration對象中所有屬性的鍵值對。

例5-3. Tool實現示例,用於打印一個Configuration對象的屬性

  1. public class ConfigurationPrinter extends Configured implements Tool {  
  2.  
  3.   static {  
  4.     Configuration.addDefaultResource("hdfs-default.xml");  
  5.     Configuration.addDefaultResource("hdfs-site.xml");  
  6.     Configuration.addDefaultResource("mapred-default.xml");  
  7.     Configuration.addDefaultResource("mapred-site.xml");  
  8. }  
  9.  
  10. @Override  
  11. public int run(String[] args) throws Exception {  
  12.   Configuration conf = getConf();  
  13.   for (Entry<String, String> entry: conf) {  
  14.     System.out.printf("%s=%s\n", entry.getKey(), entry.getValue());  
  15.   }  
  16.     return 0;  
  17.   }  
  18.  
  19.   public static void main(String[] args) throws Exception {  
  20.     int exitCode = ToolRunner.run(new ConfigurationPrinter(), args);  
  21.     System.exit(exitCode);  
  22.   }  
  23. }  

我們把ConfigurationPrinter作爲Configured的一個子類,Configured是Configurable接口的一個實現。Tool的所有實現都需要實現Configurable(因爲Tool繼承於Configurable),Configured子類通常是一種最簡單的實現方式。run()方法通過Configurable的getConf()方法獲取Configuration,然後重複執行,將每個屬性打印到標準輸出。

靜態代碼部分用來獲取HDFS和MapReduce配置和核心配置(Configuration已經取得核心配置)。

ConfigurationPrinter的main()方法沒有直接調用自身的run()方法,而是調用ToolRunner的靜態run()方法,該方法負責在調用run()方法之前,爲Tool建立一個Configuration對象。ToolRunner還使用了GenericOptionsParser來獲取在命令行方式中指定的任何標準選項,然後,在Configuration實例上進行設置。運行下列代碼,可以看到在conf/hadoop-localhost.xml中設置的屬性。

  1. % hadoop ConfigurationPrinter -conf conf/hadoop-localhost.xml \  
  2.   | grep mapredmapred.job.tracker=  
  3. mapred.job.tracker=localhost:8021  

可以設置哪些屬性?

可以在環境中設置什麼屬性,一個有用的工具便是ConfigurationPrinter。

也可以在Hadoop安裝路徑的docs目錄中,查看所有公共屬性的默認設置,相關文件包括coredefault.html,hdfs-default.html 和mapred-default.html這幾個HTML文件。每個屬性都有用來解釋屬性作用和取值範圍的描述。

注意:在客戶端配置中設置某些屬性,將不會產生影響。例如,如果在作業提交時想通過設置mapred.tasktracker.map.tasks.maximum來改變運行作業的tasktracker的任務槽(task slot)數,結果會令你失望,因爲這個屬性只能在tasktracker的mapred-site.xml文件中進行設置。一般情況下,可以通過屬性名來告訴組件該屬性應該在哪裏進行設置,由於mapred.tasktracker.map.tasks.maximum以mapred.tasktracker開頭,因此,我們知道它只能爲tasktracker守護進程設置。但是,這不是硬性的,在有些情況下,我們需要進行嘗試,甚至去閱讀源碼。

本書討論了Hadoop的很多重要的配置屬性。在本書的網站(http://www.hadoopbook.com)上可以找到配置屬性的參考資料。

GenericOptionsParser也允許設置個別屬性。例如:

  1. % hadoop ConfigurationPrinter -D color=yellow | grep color  
  2. color=yellow 

-D選項用於將鍵color的配置屬性值設置爲yellow。設置爲-D的選項優先級要高於配置文件裏的其他屬性。這一點很有用:可以把默認屬性放入配置文件中,然後再在需要時,用-D選項來覆蓋它們。一個常見的例子是:通過-D mapred.reduce.tasks=n來設置MapReduce作業中reducer的數量。這樣會覆蓋集羣上或客戶端配置屬性文件中設置的reducer數量。

GenericOptionsParser和ToolRunner支持的其他選項見表5-1。更多的Hadoop配置API可以在第130頁的"配置API"小節中找到。

 用-D property=value選項將Hadoop屬性設置爲GenericOptionsParser (和 ToolRunner),不同於用-Dproperty=value選項將JVM系統屬性設置爲Java命令。JVM系統屬性的語法不允許D和屬性名之間有任何空格,而GenericOptionsParser要求用空格來分隔D和屬性名。

JVM系統屬性來自於java.lang.System類,而Hadoop屬性只能從Configuration對象中獲取。所以,下面的命令行將沒有任何輸出,因爲ConfigurationPrinter沒有使用System類

  1. % hadoop -Dcolor=yellow ConfigurationPrinter | grep color 

如果希望通過系統屬性進行配置,則需要在配置文件中反映相關的系統屬性。具體討論見第132頁的"可變的擴展"小節。

表5-1. GenericOptionsParser選項和ToolRunner 選項

選項名稱

描述

-D property=value

將指定值賦值給確定的Hadoop配置屬性。

覆蓋配置文件裏的默認屬性或站點屬性,

或通過-conf選項設置的任何屬性

-conf filename ...

將指定文件添加到配置的資源列表中。

這是設置站點屬性或同時設置一組屬性的簡便方法

-fs uri

用指定的URI設置默認文件系統。這是

-D fs.default.name=uri的快捷方式

-jt host:port

用指定主機和端口設置jobtracker。這是-

D mapred.job.tracker= host:port的快捷方式

-filesfile1,file2,...

從本地文件系統(或任何指定模式的文件系統)

中複製指定文件到jobtracker所用的共享文件

系統(通常是HDFS),確保在任務工作目錄的

MapReduce程序可以訪問這些文件(要想進一步

瞭解如何複製文件到tasktracker機器的分佈式緩

存機制,請參見第253頁的“分佈式緩存”小節)

-archives
archive1,archive2,..

從本地文件系統(或任何指定模式的文件系統)

複製指定存檔到jobtracker所用的共享文件系統

(通常是HDFS),打開存檔文件,確保任務工作

目錄的MapReduce程序可以訪問這些存檔


選項名稱

描述

-libjarsjar1,jar2,…

從本地文件系統(或任何指定模式的文件系統)複製指

定JAR文件到被jobtracker 使用的共享文件系統

(通常是HDFS),把它們加入MapReduce任務的類路

徑中。這個選項適用於傳輸作業需要的JAR文件

原文地址:http://book.51cto.com/art/201106/269668.htm
發佈了29 篇原創文章 · 獲贊 7 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章