真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

hadoop-common中Configuration的示例代碼

這篇文章主要為大家展示了“ hadoop-common中Configuration的示例代碼 ”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“ hadoop-common中Configuration的示例代碼 ”這篇文章吧。

創(chuàng)新互聯(lián)專注于西平企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城建設(shè)。西平網(wǎng)站建設(shè)公司,為西平等地區(qū)提供建站服務(wù)。全流程定制開發(fā),專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

Configuration類實現(xiàn)了Iterable、Writable接口,使得可以遍歷和序列化(hadoop自己序列化)

配置文件格式

lala${user.home}/hadoopdatatrue

hadoop是通過xml進行配置的,同時支持屬性擴展,user.home當(dāng)調(diào)用get的時候,會首先通過System.getProperty()判斷是否是系統(tǒng)參數(shù),例中${user.home}就被替換成當(dāng)前用戶的path。所以,當(dāng)我們在配置hadoop時,可以直接用一些系統(tǒng)屬性,增強可移植性。
當(dāng)一個屬性被生命為final時,后面添加配置,不會覆蓋先加在的配置。
同時,因為使用的是java的DOM解析,所以支持XML的包涵,在配置文件中可以用來分類管理。

代碼分析

私有內(nèi)部類Resource

  private static class Resource {
  //私有內(nèi)部類,標記資源名字和資源對象private final Object resource;private final String name;
    ...
    }

私有內(nèi)部類DeprecatedKeyInfo、DeprecationDelta、DeprecationContext

  private static class DeprecatedKeyInfo {private final String[] newKeys;private final String customMessage;private final AtomicBoolean accessed = new AtomicBoolean(false);private final String getWarningMessage(String key) {
     }
  }  public static class DeprecationDelta {private final String key;private final String[] newKeys;private final String customMessage;
  }  private static class DeprecationContext {//存放oldkey-newkeysprivate final Map deprecatedKeyMap;//存放newkeys-oldkey,提供反查功能private final Map reverseDeprecatedKeyMap;
    DeprecationContext(DeprecationContext other, DeprecationDelta[] deltas) {
    ...this.deprecatedKeyMap = UnmodifiableMap.decorate(newDeprecatedKeyMap);this.reverseDeprecatedKeyMap =UnmodifiableMap.decorate(newReverseDeprecatedKeyMap);
    }
  }

DeprecatedKeyInfo保存了新的key和信息,如果customMessage為空,在調(diào)用getWarningMessage會自動生成默認的信息。
DeprecationDelta 保存了被遺棄的key 和 建議用的新key。
DeprecationContext封裝講被遺棄的key和推薦使用的keys、提示封裝在一起。

  private static AtomicReference deprecationContext =      new AtomicReference(          new DeprecationContext(null, defaultDeprecations));

一個全局的DeprecationContext對象,原子的,并且將默認被遺棄的key加載進去。

靜態(tài)addDeprecations方法

值得一提的是此方法很巧妙的使用無鎖的方法,但是,保證了數(shù)據(jù)的安全性,看具體代碼:

  public static void addDeprecations(DeprecationDelta[] deltas) {
    DeprecationContext prev, next;
    do {
      prev = deprecationContext.get();
      next = new DeprecationContext(prev, deltas);
    } while (!deprecationContext.compareAndSet(prev, next));
  }

compareAndSet方法是當(dāng)前對象和prev相等(==)時,更新當(dāng)前對象為next

setDeprecatedProperties

分析源碼,我們發(fā)現(xiàn),setDeprecatedProperties的作用就是為了更新overlay和properties,使得,我們在獲得key時,能得到最新的狀態(tài),看下面例子:

  configuration.addDeprecation("xx", new String[]{"xx1","xx2","xx3"});  //configuration.setDeprecatedProperties();
  System.out.println(configuration.get("xx"));

當(dāng)注釋掉configuration.setDeprecatedProperties后,我get時,獲得的事null值,所以我們要遍歷已經(jīng)被遺棄的key時,需要更新setDeprecatedProperties,可以使得被遺棄的key依舊可以被使用。

handleDeprecation

首先判斷該key是否是被遺棄的,如果是,將得到建議用的key,否則更新overlay、properties,并返回建議使用的key數(shù)組。

用樣handleDeprecation方法是,執(zhí)行刷新操作。具體用在asXmlDocument中。

static{}靜態(tài)代碼塊

分析代碼我們可以得到一下幾點:

  1. 如果在classpath下存在hadoop-site.xml,會log4j會打印警告信息,沒有加載到defaultResources。

  2. 默認加載兩個核心配置文件core-default.xml、core-site.xml

addResourceObject以及若干方法

不管用何種addResource,最終都是調(diào)用了addResourceObject(Resource resource),他首先將資源添加到一個全局的List集合,然后調(diào)用reloadConfiguration來觸發(fā)刷新properties并且標記為final的key失效。

findSubVariable substituteVars

在hadoop-2.7之前,只有一個substituteVars方法,使用java自身的正則表達式來匹配獲得${user.home }中間的值(user.home)。

hadoop-2.7版本之后,為了提升性能,自己實現(xiàn)了匹配獲取中間值的方法( findSubVariable ) ps:可能是因為,由于java自身的正則表達式方式過于消耗性能,所以,通過自己手動匹配,降低性能的消耗。

  //此方法,將字符串中${}中間的位置的區(qū)間獲取到,詳細看代碼
  private static int[] findSubVariable(String eval) {
        ...
 }  //1.將獲取key進行替換,如果System.getProperty()存在,替換
  //2.不存在,查找properties,如果存在替換,不存在,原樣保留
  private String substituteVars(String expr) {
    ...
  }

set方法

  //通過程序設(shè)置key-value,source允許為空,當(dāng)用戶不設(shè)置源時,程序自動將programatically這是為source,
  //當(dāng)值為被遺棄的,此方法會先將新key的到,并設(shè)置source為 because old key is deprecated
 public void set(String name, String value, String source) {
     ...
 }

loadResource

該方法是解析xml的,采用了DOM解析,分析代碼我們知道,xml格式需要和上面寫到的格式,同時DOM解析,支持xml文件引入。

和以前版本相比,xml配置文件中,在property中可以聲明source標簽,聲明資源的信息?

 if ("source".equals(field.getTagName()) && field.hasChildNodes())
  source.add(StringInterner.weakIntern(
      ((Text)field.getFirstChild()).getData()));

以上是“ hadoop-common中Configuration的示例代碼 ”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


本文標題:hadoop-common中Configuration的示例代碼
當(dāng)前網(wǎng)址:http://weahome.cn/article/gjhseh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部