Common簡介
從Hadoop 0.20版本開始,原來Hadoop項目的Core部分更名爲Hadoop Common。Common爲Hadoop的其他項目提供一些常用工具,主要包括系統配置工具Configuration、遠程過程調用RPC、序列化機制和Hadoop抽象文件系統FileSystem等。
配置信息處理
一般的軟件都會有一個配置模塊,來作爲擴展、定製的手段和方式。Hadoop使用配置文件將系統中的重要屬性以文件的形式進行持久化,使得這些屬性可以被重啓後的進程或者不同的進程使用。配置文件非常重要,但卻沒有標準。
1 Windows配置文件
Windows使用一種特殊化的ASCII文件,以.ini爲文件擴展名,該文件也稱爲初始化文件(Initialization File)。
INI文件中配置信息分爲“節”,用於對配置數據做一個歸類,每一個節可以包含一些與之相關的“項“,格式如下:
[SECTION]
ENTRY=VALUE ;其中VALUE可以有兩種類型:數型或字符串。
最後系統會提供一些API來對配置文件進行讀、寫。
2 Java環境配置文件
JDK提供了java.util.Properties類,繼承自Hashtable,所以不支持“節”,就是簡單的健-值對。
3 Hadoop配置文件
Hadoop使用了一套獨有的配置文件管理系統,用org.apache.hadoop.conf.Configuration來處理配置信息,並提供自己的API。Hadoop配置文件採用XML格式。
<configuration>
<property>//配置文件不支持分層或分級,每個property就是一個配置項。
<name></name>
<value></value>
<description></description>
</property>
</configuration>
重點:Configuration類中的資源加載、資源合併和屬性擴展等處理過程。
3.1 資源加載,通過對象的addResource()方法添加到Configuration對象中,添加的資源並不會立即被加載,只是清空成員變量properties(Hadoop配置文件解析後的健-值對都存放在JDK中的properties中)和finalParameters(保存聲明爲final的健-值對的健)。
properties中的數據,直到需要的時候纔會被加載進來,採用了延遲加載的設計模式。
SAX(Sinple API for XML)提供一種流式的、事件驅動的XML處理方式,但編寫處理邏輯比較複雜,適合處理大XML文件。
DOM(Document object Model)先將XML文檔裝入內存,然後根據文檔中定義的元素和屬性在內存中創建一個“樹形結構”,也就是一個文檔對象模型,將文檔對象化,文檔中每個節點對應着模型中一個對象;然後使用對象提供的編程接口,訪問XML文檔進而操作XML文檔。Hadoop的配置文件都是小文件,因此Configuration使用DOM方式處理XML。
3.2 資源合併,多次調用Configuration.addResource()將多個配置文件合併成一個。如果兩個配置資源包含有相同的配置項,而且前一個資源的配置項沒有標記爲final,那後面的配置項將覆蓋前面的配置項。
使用get*和set*訪問/設置配置項
get*一共有21個方法,最重要的是get()方法,它根據配置項的健獲取對應的值,如果健不存在,則返回默認值。其他的方法都依賴Configuration.get(),並在此基礎上做進一步處理。Configuration.get()會調用Configuration的私有方法substituteVars(),該方法通過正則表達式完成配置項的屬性擴展(屬性擴展最多隻能進行20次,避免擴展出現死循環)。
set*對輸入進行類型轉換等處理後,最終調用Configuration.set(),保存傳入的健-值對。
3.3 屬性擴展,Configuration.get()會調用Configuration的私有方法substituteVars(),該方法通過正則表達式完成配置項的屬性擴展。如配置項dfs.name.dir的值是${hadoop.tmp.dir}/dfs/name,其中${hadoop.tmp.dir}會使用Configuration中的相應屬性值進行擴展。
Configurable(可配置的)接口,如果一個類實現了Configurable接口,意味着這個類是可配置的。也就是說,可以通過爲這個類的對象傳入一個Configuration實例,提供對象工作需要的一些配置信息。