輔助類GenericOptionsParser,Tool和ToolRunner
爲了簡化命令行方式運行作業,Hadoop自帶了一些輔助類。GenericOptionsParser是一個類,用來解釋常用的Hadoop命令行選項,並根據需要,爲Configuration對象設置相應的取值。通常不直接使用GenericOptionsParser,更方便的方式是:實現Tool接口,通過ToolRunner來運行應用程序,ToolRunner內部調用GenericOptionsParser:
- GenericOptionsParser:
- public interface Tool extends Configurable {
- int run(String [] args) throws Exception;
- }
例5-3給出了一個非常簡單的Tool的實現,用來打印Tool的Configuration對象中所有屬性的鍵值對。
例5-3. Tool實現示例,用於打印一個Configuration對象的屬性
- public class ConfigurationPrinter extends Configured implements Tool {
- static {
- Configuration.addDefaultResource("hdfs-default.xml");
- Configuration.addDefaultResource("hdfs-site.xml");
- Configuration.addDefaultResource("mapred-default.xml");
- Configuration.addDefaultResource("mapred-site.xml");
- }
- @Override
- public int run(String[] args) throws Exception {
- Configuration conf = getConf();
- for (Entry<String, String> entry: conf) {
- System.out.printf("%s=%s\n", entry.getKey(), entry.getValue());
- }
- return 0;
- }
- public static void main(String[] args) throws Exception {
- int exitCode = ToolRunner.run(new ConfigurationPrinter(), args);
- System.exit(exitCode);
- }
- }
我們把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中設置的屬性。
- % hadoop ConfigurationPrinter -conf conf/hadoop-localhost.xml \
- | grep mapredmapred.job.tracker=
- 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也允許設置個別屬性。例如:
- % hadoop ConfigurationPrinter -D color=yellow | grep color
- 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類
- % 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 |
從本地文件系統(或任何指定模式的文件系統) 複製指定存檔到jobtracker所用的共享文件系統 (通常是HDFS),打開存檔文件,確保任務工作 目錄的MapReduce程序可以訪問這些存檔 |
選項名稱 |
描述 |
-libjarsjar1,jar2,… |
從本地文件系統(或任何指定模式的文件系統)複製指 定JAR文件到被jobtracker 使用的共享文件系統 (通常是HDFS),把它們加入MapReduce任務的類路 徑中。這個選項適用於傳輸作業需要的JAR文件 |