Hadoop源碼分析 之Configuration配置

本文轉自:http://blog.csdn.net/dahaifeiyu/article/details/6655652

      最近也覺得應該仔細的看一下Hadoop的源代碼了,以前只是懂得基本的架構了使用,最近在做一個系統,覺得很多東西可以借鑑MapReduce的 可擴展性。但是當我們的系統的0.1版本出現的時候才發現我們的配置上很混亂。於是我自己的看了一下Hadoop的Configuration類,真的覺 得Hadoop的配置是值得借鑑的,學到了很多!下面是Configuration類的屬性清單:

         Log是記錄日誌的對象。quietmode對應的是配置信息加載過程中是否屬於靜默的模式,如果處於靜默的模式下,則在配置信息加載的過程中的一些信息 不會被記錄在日誌中,默認情況是設置爲true的。resources是一個對象數組,用於存放有關包含配置信息的對象。finalParameter是 所有配置值被聲明爲final的變量的一個集合。loadDefault從表面字段上可以理解爲是否要加載默認的配置。REGISTRY是一個 WeakHashMap,用於多有個對象的相關配置的註冊對它們進行管理,弱哈希可以自動清除不在正常使用的鍵對應的條目。 defaultResources是一個CopyOnWrite的字符串數組,用於存儲默認的配置資源名或者路徑。{…}是一個靜態初始化塊,用於加載默 認的配置資源。properties存儲的是Configuration對象中的全部配置信息,它的類型是Properties的,這個類型是Java提 供的對KV配置的一個屬性集,提高了對KV配置參數的存儲和操作方法。overlay則是進行覆蓋的屬性。classLoader主要是用於配置衝根據配 置的參數構造相應的對象實例時提供上下文環境的類加載器。varPat是一個對含有環境變量的值的進行轉換的正則表達式對象,比如我們設定的一個路徑變量 的值爲$HOME/data,那麼這個變量就會以一定的規則把該變量的值分爲字串$HOME和/data,之後會把$HOME解析成系統上的家目錄了。 MAX_SUBST是設定對帶有環境變量的值所能夠深入解析的層次數,超出這個最大的層數的值將不能夠解析。

      下面具體的說一下各個方法的情況。Configuration類的方法按照訪問控制來分有兩類,就是private和public,其中private主要是public方法的一些工具。其中:

構造方法三個:

第二個是可以指定是否加載默認設置,默認爲true,第三個是用一個configuration對象構造一個新的configuration對象。

下面是幾個添加配置資源的方法:

       分別是添加默認的或者指定的各種來源的配置資源,而reloadConfiguration()則是一個清除所有原有配置信息,以便於重新加載配置信息的方法,這可以在值的覆蓋中或者用新的配置資源覆蓋之前的配置資源的時候用到。

下面主要是獲取一些配置信息的set或者get方法和其他方法:

configuration 方法

       substituteVars(String)方法就是配合上面的正則表達式對象對含有環境變量的參數值進行解析的方法。後面的set和get方法主要是 獲取各種參數值的方法,它的主要機制是通過getPros()調用 loadResources(Properties,ArrayList,boolean)方法再調用 loadResource(Properties,Object,boolean)加載配置資源中的配置信息,而set(String,String)和 get(String)的方法中會調用getPros()方法獲取當前Configuration對象的properties對象,如果該對象爲空,則調 用loadResources(Properties,ArrayList,boolean)方法加載配置信息,之後的其他get和set方法都是通過調 用get(String)和set (String,String)方法來實現對配置信息的操作的。最後幾個方法分別是size()方法是獲取配置信息大小的,clear()方法是用於清除 配置信息的,IntegerRanges是一個關於整型數範圍的內部類,iterator()是配置對象的一個迭代器,最後的 readFields(DataInput)方法和write(DataOutput)方法則是因爲Configuration類實現了Writable 接口的實現方法,這樣Configuration類就可以在集羣中進行分發,使得同一個作業的所有節點上的配置信息都完全相同。

這就是Hadoop的配置信息的核心類,從這裏可以看出一個大型的分佈式系統中該如何去提供一個有價值的配置,來實現系統的可用和滿足業務的靈活性。我總結有一下幾點:

1.     需要提供各種的set和get方法,方便獲取各種的配置參數值,比如上面的大量的set和get方法以及它們的實現邏輯。

2.     適當的集合垃圾回收機制和線程同步問題採用合理的存儲數據結構,比如這裏用到的弱哈希和CopyOnWriteArrayList,還有在對Configuration.class進行的加鎖

3.     分佈式系統中的配置一定要實現序列化,這樣才能在集羣中保持配置信息的一致性,使得配置信息可以從流中來到留中去。

4.     一個分佈式系統的配置方法應該是至少分爲3層的,第一層就是默認的,也是全局的靜態配置,第二層是可以針對每個作業可以定製的參數,這個是用 Configuration中的set方法即可做到,第三層就是通過命令行的方式爲一次的作業進程組定製配置參數。這三層的作用域不同,他們的作用域依次 是全局系統、一個作業程序、一次作業運行的進程組,每一次都可以覆蓋前一層的參數值。

在這裏我覺得對於Hadoop的配置參數過多,通過set方法設置需要知道相應的參數名字,這是很不方便的,但是也滿足了靈活性,用戶可以自己定製配置參數。也可以提供一個枚舉類對相應的參數給予描述,用起來會更方便一些。

發佈了35 篇原創文章 · 獲贊 13 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章