這篇文章主要介紹了Hadoop配置信息怎么處理,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

1 配置文件簡(jiǎn)介
配置文件是一個(gè)靈活系統(tǒng)不可缺少的一部分,雖然配置文件非常重要,但卻沒(méi)有標(biāo)準(zhǔn)。
1.1 Java配置文件
JDK提供了java.util.Properties類(lèi),用于處理簡(jiǎn)單的配置文件。Properties很早就被引入到Java的類(lèi)庫(kù)中,并且一直沒(méi)有什么變化。它繼承自Hashtable,表示了一個(gè)持久的屬性集,該集可保存在流中或從流中加載。屬性列表中每個(gè)鍵及其對(duì)應(yīng)值都是字符串類(lèi)型。
public class Properties extends Hashtable<Object,Object> {
……
}Properties處理的配置文件格式非常簡(jiǎn)單,它只支持鍵-值對(duì),等號(hào)左邊為鍵,右邊為值。值。形式如下:
ENTRY=VALUE
java.util.Properties中用于處理屬性列表的主要方法如下:
1、getProperty():用于在屬性列表中獲取指定鍵(參數(shù)key)對(duì)應(yīng)的屬性,它有兩個(gè)形式,一個(gè)不提供默認(rèn)值,另一個(gè)可以提供默認(rèn)值。
2、setProperty():用于在屬性列表中設(shè)置/更新屬性值。
3、load():該方法從輸入流中讀取鍵-值對(duì)。
4、store():該方法則將Properties表中的屬性列表寫(xiě)入輸出流。
相關(guān)代碼如下:
//用指定的鍵在此屬性列表中搜索屬性 public String getProperty(String key) //功能同上,參數(shù)defaultValue提供了默認(rèn)值 public String getProperty(String key, String defaultValue) //最終調(diào)用Hashtable的方法put public synchronized Object setProperty(String key, String value)
使用輸入流和輸出流,Properties對(duì)象不但可以保存在文件中,而且還可以保存在其他支持流的系統(tǒng)中,如Web服務(wù)器。J2SE 1.5版本以后,Properties中的數(shù)據(jù)也可以以XML格式保存,對(duì)應(yīng)的加載和寫(xiě)出方法是loadFromXML()和storeToXML()。
1.2 Java社區(qū)提供的配置文件
由于java.util.Properties提供的能力有限,Java社區(qū)中出現(xiàn)了大量的配置信息讀/寫(xiě)方案,其中比較有名的是Apache Jakarta Commons工具集中提供的Commons Configuration。
Commons Configuration中的PropertiesConfiguration類(lèi)提供了豐富的訪(fǎng)問(wèn)配置參數(shù)的方法。具體特性如下:
1、支持文本、XML配置文件格式。
2、支持加載多個(gè)配置文件。
3、支持分層或多級(jí)的配置。
4、提供對(duì)單值或多值配置參數(shù)的基于類(lèi)型的訪(fǎng)問(wèn)。
應(yīng)該說(shuō),Commons Configuration是一個(gè)功能強(qiáng)大的配置文件處理工具。
1.3 Hadoop提供的配置文件
Hadoop沒(méi)有使用java.util.Properties管理配置文件,也沒(méi)有使用Apache Jakarta Commons Configuration管理配置文件,而是使用了一套獨(dú)有的配置文件管理系統(tǒng),并提供自己的API。
即使用org.apache.hadoop.conf.Configuration處理配置信息。
2 HadoopConfiguration詳解
2.1 Hadoop配置文件的格式
Hadoop配置文件采用XML格式,下面是Hadoop配置文件的一個(gè)例子:
<?xml version=“1.0”?> <?xml-stylesheet type="text/xsl"href="configuration.xsl"?> <configuration> <property> <name>io.sort.factor</name> <value>10</value> <final>true</final> <description>The number of ……</description> </property> </configuration>
Hadoop配置文件的元素含義如下:
1、Hadoop配置文件的根元素是configuration,一般只包含子元素property。
2、每一個(gè)property元素就是一個(gè)配置項(xiàng),配置文件不支持分層或分級(jí)。
3、每個(gè)配置項(xiàng)一般包括配置屬性的名稱(chēng)name、值value和一個(gè)關(guān)于配置項(xiàng)的描述description。
4、元素final和Java中的關(guān)鍵字final類(lèi)似,意味著這個(gè)配置項(xiàng)是“固定不變的”。final一般不出現(xiàn),但在合并資源的時(shí)候,可以防止配置項(xiàng)的值被覆蓋。
5、Hadoop配置系統(tǒng)還有一個(gè)很重要的功能,就是屬性擴(kuò)展。如配置項(xiàng)dfs.name.dir的值是${hadoop.tmp.dir}/dfs/name,其中,${hadoop.tmp.dir}會(huì)使用Configuration中的相應(yīng)屬性值進(jìn)行擴(kuò)展。如果hadoop.tmp.dir的值是"data",那么擴(kuò)展后的dfs.name.dir的值就是"data/dfs/name"。
2.2 Configuration類(lèi)概述
在Configuration類(lèi)中,每個(gè)屬性都是String類(lèi)型的,但是值類(lèi)型可能是以下多種類(lèi)型,包括Java中的基本類(lèi)型,如boolean(getBoolean)、int(getInt)、long(getLong)、float(getFloat),也可以是其他類(lèi)型,如String(get)、java.io.File(getFile)、String數(shù)組(getStrings)等。
Configuration類(lèi)還可以合并資源,合并資源是指將多個(gè)配置文件合并,產(chǎn)生一個(gè)配置。如果有兩個(gè)配置文件,也就是兩個(gè)資源,如core-default.xml和core-site.xml,通過(guò)Configuration類(lèi)的loadResources()方法,把它們合并成一個(gè)配置。代碼如下:
Configurationconf=new Configuration(); conf.addResource("core-default.xml"); conf.addResource("core-site.xml");
如果這兩個(gè)配置資源都包含了相同的配置項(xiàng),而且前一個(gè)資源的配置項(xiàng)沒(méi)有標(biāo)記為final,那么,后面的配置將覆蓋前面的配置。
如果在第一個(gè)資源中某配置項(xiàng)被標(biāo)記為final,那么,在加載第二個(gè)資源的時(shí)候,會(huì)有警告提示。
使用Configuration類(lèi)的一般過(guò)程是:構(gòu)造Configuration對(duì)象,并通過(guò)類(lèi)的addResource()方法添加需要加載的資源;然后就可以使用get*方法和set*方法訪(fǎng)問(wèn)/設(shè)置配置項(xiàng),資源會(huì)在第一次使用的時(shí)候自動(dòng)加載到對(duì)象中。
2.3 Configuration的成員變量
首先來(lái)看看org.apache.hadoop.conf.Configuration的類(lèi)圖:

從類(lèi)圖可以看到,Configuration有7個(gè)主要的非靜態(tài)成員變量。
1、quietmode:是布爾變量,用來(lái)設(shè)置加載配置的模式。如果quietmode為true(默認(rèn)值),則在加載解析配置文件的過(guò)程中,不輸出日志信息。該變量只是一個(gè)方便開(kāi)發(fā)人員調(diào)試的變量。
2、resources:是數(shù)組變量,該變量保存了所有通過(guò)addResource()方法添加Configuration對(duì)象的資源。
3、loadDefaults:布爾變量,用于確定是否加載默認(rèn)資源,這些默認(rèn)資源保存在defaultResources中。
注意:defaultResources是個(gè)靜態(tài)成員變量,通過(guò)方法addDefaultResource()可以添加系統(tǒng)的默認(rèn)資源。
在HDFS中,會(huì)把hdfs-default.xml和hdfs-site.xml作為默認(rèn)資源,并通過(guò)addDefaultResource()保存在成員變量defaultResources中;
在MapReduce中,默認(rèn)資源是mapred-default.xml和mapred-site.xml。
4、properties:是java.util.Properties類(lèi)型,與配置項(xiàng)相關(guān)的成員變量。
5、overlay:是java.util.Properties類(lèi)型的,用于記錄通過(guò)set()方式改變的配置項(xiàng)。也就是說(shuō),出現(xiàn)在overlay中的鍵-值對(duì)是應(yīng)用設(shè)置的,而不是通過(guò)對(duì)配置資源解析得到的。
6、finalParameters:類(lèi)型是Set<String>,用來(lái)保存所有在配置文件中已經(jīng)被聲明為final的鍵-值對(duì)的鍵。
提示:
A、Hadoop配置文件解析后的鍵-值對(duì),都存放在properties中。
B、properties、overlay、finalParameters配置項(xiàng)相關(guān)的成員變量
7、classLoader:一個(gè)很重要的成員變量,這是一個(gè)類(lèi)加載器變量,可以通過(guò)它來(lái)加載指定類(lèi),也可以通過(guò)它加載相關(guān)的資源。
了解了Configuration各成員變量的具體含義,Configuration類(lèi)的其他部分就比較容易理解了,它們都是為了操作這些變量而實(shí)現(xiàn)的解析、設(shè)置、獲取方法。
2.4 Configuration的資源加載
2.4.1 addResource方法
資源通過(guò)對(duì)象的addResource()方法或類(lèi)的靜態(tài)addDefaultResource()方法(設(shè)置了loadDefaults標(biāo)志)添加到Configuration對(duì)象中。
addResource方法有4種形式:
addResource(String name)//根據(jù)classpath資源加載 addResource(URL url)//根據(jù)URL資源加載 addResource(Path file)//根據(jù)文件路徑對(duì)象加載 addResource(InputStream in)//根據(jù)一個(gè)已經(jīng)打開(kāi)的輸入流對(duì)象加載
同時(shí),添加的資源并不會(huì)立即加載,只是通過(guò)reloadConfiguration()方法清空properties和finalParameters。相關(guān)代碼如下:
//以classpath資源為例
public void addResource(InputStream in) {
addResourceObject(new Resource(in));
}
private synchronized void addResourceObject(Resource resource) {
resources.add(resource); // 添加到resources成員變量
reloadConfiguration();
}
public synchronized void reloadConfiguration() {
properties = null; // 觸發(fā)資源的重新加載
finalParameters.clear(); // 清除不改變參數(shù)的限制
}2.4.2 addDefaultResource方法
靜態(tài)方法addDefaultResource也能清空Configuration對(duì)象中的數(shù)據(jù)(費(fèi)靜態(tài)成員變量),這是通過(guò)類(lèi)的靜態(tài)成員變量REGISTRY作為媒介進(jìn)行的。
REGISTRY記錄了系統(tǒng)中所有的Configuration對(duì)象,代碼如下:
//靜態(tài)變量
private static final WeakHashMap<Configuration, Object> REGISTRY = new WeakHashMap<Configuration, Object>();
//記錄Configuration對(duì)象
public Configuration(boolean loadDefaults) {
this.loadDefaults = loadDefaults;
updatingResource = new ConcurrentHashMap<String, String[]>();
synchronized (Configuration.class) {
REGISTRY.put(this, null);
}
}當(dāng)addDefaultResource被調(diào)用時(shí),遍歷REGISTRY的里面的所有的Configuration對(duì)象,并在Configuration對(duì)象上調(diào)用reloadConfiguration方法,這樣就可以觸發(fā)資源的新的加載,相關(guān)代碼如下:
public static synchronized void addDefaultResource(String name) {
if (!defaultResources.contains(name)) {
defaultResources.add(name);
for (Configuration conf : REGISTRY.keySet()) {
if (conf.loadDefaults) {
conf.reloadConfiguration();
}
}
}
}2.4.3 getProps方法
成員變量properties中的數(shù)據(jù),直到需要的時(shí)候才會(huì)加載進(jìn)來(lái)。在getPrpops方法,如果發(fā)現(xiàn)properties為空,將會(huì)觸發(fā)loadResources()方法加載配置資源,這里其實(shí)采用了延遲加載的設(shè)計(jì)模式,當(dāng)真正需要配置數(shù)據(jù)的時(shí)候,才會(huì)開(kāi)始分析配置文件,這樣可以節(jié)省系統(tǒng)資源,提高性能。相關(guān)代碼如下:
protected synchronized Properties getProps() {
if (properties == null) {
properties = new Properties();
Map<String, String[]> backup = new ConcurrentHashMap<String, String[]>(updatingResource);
loadResources(properties, resources, quietmode);
if (overlay != null) {
properties.putAll(overlay);
for (Map.Entry<Object, Object> item : overlay.entrySet()) {
String key = (String) item.getKey();
String[] source = backup.get(key);
if (source != null) {
updatingResource.put(key, source);
}
}
}
}
return properties;
}2.4.4 loadResources方法
Hadoop的配置文件都是XML形式,JAXP,Java API for XML Processing,是一種穩(wěn)定、可靠的XML處理API處理XML,一般有兩種方式
1、SAX,SimpleAPI for XML,提供了一種流式的、事件驅(qū)動(dòng)的XML處理方式,但是編寫(xiě)比較復(fù)雜,比較適合處理大的XML文件。
2、DOM,DocumentObject Model,該方式的工作方式是:
A、將XML文檔一次性裝入內(nèi)存;
B、根據(jù)文檔中定義的元素和屬性在內(nèi)存中創(chuàng)建一個(gè)樹(shù)形結(jié)構(gòu),將文檔對(duì)象化,文檔中的每個(gè)節(jié)點(diǎn)對(duì)應(yīng)著模型中一個(gè)對(duì)象。
C、使用對(duì)象提供的編程接口,訪(fǎng)問(wèn)XML文檔進(jìn)而操作XML文檔。
由于Hadoop的配置文件都是很小文件,因此Configuration對(duì)象使用DOM處理XML。
首先分析DOM加載部分的代碼:
private Resource loadResource(Properties properties, Resource wrapper, boolean quiet) {
String name = UNKNOWN_RESOURCE;
try {
//得到用于創(chuàng)建DOM解析器的工廠(chǎng)
Object resource = wrapper.getResource();
name = wrapper.getName();
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
// 忽略XML中的注釋
docBuilderFactory.setIgnoringComments(true);
// 提供對(duì)XML名稱(chēng)空間的支持
docBuilderFactory.setNamespaceAware(true);
try {
//設(shè)置Xinclude處理狀態(tài)為true,即允許XInclude機(jī)制
docBuilderFactory.setXIncludeAware(true);
} catch (UnsupportedOperationException e) {
......
}
//獲取解析的XML的DocumentBuilder對(duì)象
DocumentBuilder builder = docBuilderFactory.newDocumentBuilder();
Document doc = null;
Element root = null;
boolean returnCachedProperties = false;
//根據(jù)不同資源,做預(yù)處理病調(diào)用相應(yīng)形式的
if (resource instanceof URL) {
//URL資源形式
......
} else if (resource instanceof String) {
//classpath資源形式
......
} else if (resource instanceof Path) {
//hadoop的PATH資源形式
......
} else if (resource instanceof InputStream) {
//輸入流的資源形式
......
} else if (resource instanceof Properties) {
//鍵值對(duì)的資源形式
......
} else if (resource instanceof Element) {
//處理configuration對(duì)象的子元素
root = (Element) resource;
}
.......一般的JAXP處理都是從工廠(chǎng)開(kāi)始,通過(guò)調(diào)用DocumentBuilderFactory的newInstance方法,獲得創(chuàng)建DOM解析器的工廠(chǎng)。這里并沒(méi)有創(chuàng)建出DOM解析器,只是獲得一個(gè)用于創(chuàng)建DOM解析器的工廠(chǎng),接下來(lái)需要上述newInstance方法得到的DocumentBuilder對(duì)象進(jìn)行一些設(shè)置,才能進(jìn)一步通過(guò)DocumentBuilder,得到DOM解析器對(duì)象builder。
針對(duì)DocumentBuilder對(duì)象進(jìn)行的主要設(shè)置包括:
A、忽略XML文檔中的注釋
B、支持XML空間
C、支持XML的包含機(jī)制。
Xinclude機(jī)制允許將XML文檔分解為多個(gè)可管理的塊,然后將一個(gè)或者多個(gè)較小的文檔組裝成一個(gè)大型文檔。也就是說(shuō),hadoop的一個(gè)配置文件中,可以利用XInclude機(jī)制將其他配置文件包含進(jìn)來(lái)一并處理。例子如下:
<configuration> <xi:include href=’ssd.xml’> </configuration>
通過(guò)XInclude機(jī)制,將引用的xml文件嵌入到當(dāng)前配置文件,這種方法更有利于對(duì)配置文件進(jìn)行模塊化管理,同時(shí)就不需要在使用addResource方法再重新加載引用的xml文件。
設(shè)置完DocumentBuilderFactory對(duì)象以后,通過(guò)
DocumentBuilderFactory.newDocumentBuilder獲得了DocumentBuilder對(duì)象,用于從各種輸入解析XML。
在loadResource中,需要根據(jù)Configuration對(duì)象支持的4種資源分別進(jìn)行處理,不過(guò)這4種情況最終調(diào)用DocumentBuilder.parse()函數(shù),返回一個(gè)DOM解析結(jié)果。
如果輸入時(shí)一個(gè)DOM的子元素,那么將解析結(jié)果設(shè)置為輸入元素。這是為了處理下面出現(xiàn)的元素Configuration包含Configuration子節(jié)點(diǎn)的特殊情況。
成員函數(shù)loadResource的第二部分代碼,就是根據(jù)DOM的解析結(jié)果設(shè)置成Configuration的成員變量properties和finalParameters。
在確認(rèn)XML的根節(jié)點(diǎn)是configuration以后,獲取根節(jié)點(diǎn)的所有子節(jié)點(diǎn)并對(duì)所有子節(jié)點(diǎn)進(jìn)行處理。這里需要注意,元素configuration的子節(jié)點(diǎn)可以是configuration,也可以是properties。如果是configuration,則遞歸調(diào)用loadResource方法,在loadResource方法的處理過(guò)程中,子節(jié)點(diǎn)會(huì)被作為根節(jié)點(diǎn)得到繼續(xù)的處理。
如果是property子節(jié)點(diǎn),那么試圖獲取property的子元素name、value和final。在成功獲得name和value的值后,根據(jù)情況后設(shè)置對(duì)象的成員變量propertis和finalParameters。相關(guān)代碼如下:
if (root == null) {
if (doc == null) {
if (quiet) {
return null;
}
throw new RuntimeException(resource + " not found");
}
//根節(jié)點(diǎn)應(yīng)該是configuration
root = doc.getDocumentElement();
}
Properties toAddTo = properties;
if (returnCachedProperties) {
toAddTo = new Properties();
}
if (!"configuration".equals(root.getTagName()))
LOG.fatal("bad conf file: top-level element not <configuration>");
//獲取根節(jié)點(diǎn)的所有子節(jié)點(diǎn)
NodeList props = root.getChildNodes();
DeprecationContext deprecations = deprecationContext.get();
for (int i = 0; i < props.getLength(); i++) {
Node propNode = props.item(i);
if (!(propNode instanceof Element))
//如果子節(jié)點(diǎn)不是Element,忽略
continue;
Element prop = (Element) propNode;
if ("configuration".equals(prop.getTagName())) {
//如果是子節(jié)點(diǎn)是configuration,遞歸調(diào)用loadResource進(jìn)行處理,
//這意味著configuration的子節(jié)點(diǎn)是configuration
loadResource(toAddTo, new Resource(prop, name), quiet);
continue;
}
//子節(jié)點(diǎn)是property
if (!"property".equals(prop.getTagName()))
LOG.warn("bad conf file: element not <property>");
NodeList fields = prop.getChildNodes();
String attr = null;
String value = null;
boolean finalParameter = false;
LinkedList<String> source = new LinkedList<String>();
//查找name、value和final的值
for (int j = 0; j < fields.getLength(); j++) {
Node fieldNode = fields.item(j);
if (!(fieldNode instanceof Element))
continue;
Element field = (Element) fieldNode;
if ("name".equals(field.getTagName()) && field.hasChildNodes())
attr = StringInterner.weakIntern(((Text) field.getFirstChild()).getData().trim());
if ("value".equals(field.getTagName()) && field.hasChildNodes())
value = StringInterner.weakIntern(((Text) field.getFirstChild()).getData());
if ("final".equals(field.getTagName()) && field.hasChildNodes())
finalParameter = "true".equals(((Text) field.getFirstChild()).getData());
if ("source".equals(field.getTagName()) && field.hasChildNodes())
source.add(StringInterner.weakIntern(((Text) field.getFirstChild()).getData()));
}
source.add(name);
......2.4.5 get*方法
get*一共代表21個(gè)方法,它們用于在configuration對(duì)象中獲取相應(yīng)的配置信息。
這些配置信息可以是boolean、int、long等基本類(lèi)型,也可以是其他一些hadoop常用類(lèi)型,如類(lèi)的信息ClassName、Classes、Class,String數(shù)組StringCollection、Strings,URL等。這些方法里最重要的是get()方法,它根據(jù)配置項(xiàng)的鍵獲取對(duì)應(yīng)的值,如果鍵不存在,則返回默認(rèn)值defaultValue。其他的方法都會(huì)依賴(lài)于get()方法,并在get()的基礎(chǔ)上做進(jìn)步一處理。先關(guān)代碼如下:
public String get(String name) {
String[] names = handleDeprecation(deprecationContext.get(), name);
String result = null;
for (String n : names) {
result = substituteVars(getProps().getProperty(n));
}
return result;
}get原生方法會(huì)調(diào)用Configuration的私有方法substitutevars方法,該方法會(huì)完成配置的屬性擴(kuò)展。
屬性擴(kuò)展是指配置項(xiàng)的值包含${key}這種格式的變量,這些變量會(huì)被自動(dòng)替換成相應(yīng)的值。也就是說(shuō)${key}會(huì)被替換成以key為鍵的配置項(xiàng)的值。
注意,如果${key}替換后,得到的配置項(xiàng)值仍然包含變量,這個(gè)過(guò)程會(huì)繼續(xù)進(jìn)行,知道替換后的值中不再出現(xiàn)變量為止。
最后一點(diǎn)需要注意的是,subsititute中進(jìn)行的屬性擴(kuò)展,不但可以使用保存在Configuration對(duì)象的鍵值對(duì),而且還可以使用java虛擬的系統(tǒng)屬性。屬性擴(kuò)展優(yōu)先使用系統(tǒng)屬性,然后才是Configuration對(duì)象中保存的鍵值對(duì)。但是為了防止屬性擴(kuò)展的獲取的死循環(huán),故而循環(huán)20次后就終止獲取,20次后還沒(méi)有獲取到值的話(huà),將拋出異常。
2.4.6 set*方法
相對(duì)get*來(lái)說(shuō),set*的大多數(shù)方法都很簡(jiǎn)單,這些方法相對(duì)輸入進(jìn)行類(lèi)型轉(zhuǎn)換等處理后,最終都調(diào)用了set()方法,這個(gè)方法簡(jiǎn)單調(diào)用了成員變量properties和overlay的setroperty方法,保存?zhèn)魅氲逆I值對(duì)。代碼如下:
public void set(String name, String value, String source) {
//預(yù)檢查參數(shù)
Preconditions.checkArgument(name != null, "Property name must not be null");
Preconditions.checkArgument(value != null, "The value of property " + name + " must not be null");
name = name.trim();
DeprecationContext deprecations = deprecationContext.get();
if (deprecations.getDeprecatedKeyMap().isEmpty()) {
//加載資源
getProps();
}
getOverlay().setProperty(name, value);
getProps().setProperty(name, value);
String newSource = (source == null ? "programatically" : source);
if (!isDeprecated(name)) {
updatingResource.put(name, new String[] { newSource });
String[] altNames = getAlternativeNames(name);
if (altNames != null) {
for (String n : altNames) {
if (!n.equals(name)) {
getOverlay().setProperty(n, value);
getProps().setProperty(n, value);
updatingResource.put(n, new String[] { newSource });
}
}
}
} else {
String[] names = handleDeprecation(deprecationContext.get(), name);
String altSource = "because " + name + " is deprecated";
for (String n : names) {
getOverlay().setProperty(n, value);
getProps().setProperty(n, value);
updatingResource.put(n, new String[] { altSource });
}
}
}3 Configurable接口
Configurable是一個(gè)很簡(jiǎn)單的接口,也位于org.apache.hadoop.conf包中。類(lèi)圖如下:

在字面理解,Configurable的含義是可配置的,如果是一個(gè)類(lèi)實(shí)現(xiàn)了Configurable接口,意味著這個(gè)類(lèi)是可配置的,也就是說(shuō),可以通過(guò)這類(lèi)的一個(gè)Configuration實(shí)例,提供對(duì)象需要的一些配置信息。Hadoop的代碼中有大量的實(shí)現(xiàn)了Coonfigurable接口,如
org.apache.hadoop.mapred.SequenceFileInputFilter.RegexFilter。
Configurable.setConf方法何時(shí)被調(diào)用呢?一般來(lái)說(shuō),對(duì)象創(chuàng)建以后,就應(yīng)該使用setConf方法,為對(duì)象提供進(jìn)一步的初始化工作。為了簡(jiǎn)化創(chuàng)建和調(diào)用setConf方法這兩個(gè)連續(xù)的步驟:
org.apache.hadoop.util.ReflectionUtils中提供了靜態(tài)方法
newInstance方法,該方法利用java反射機(jī)制,根據(jù)對(duì)象類(lèi)型信息。創(chuàng)建一個(gè)新的相應(yīng)類(lèi)型的對(duì)象,然后調(diào)用ReflectionUtils中的另一個(gè)靜態(tài)方法setConf配置對(duì)象。
在setConf方法中,如果對(duì)象實(shí)現(xiàn)了Configurable接口,那么對(duì)象的setConf方法會(huì)被調(diào)用,并根據(jù)Configuration 的實(shí)例conf進(jìn)一步初始化對(duì)象。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Hadoop配置信息怎么處理”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前文章:Hadoop配置信息怎么處理-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://www.chinadenli.net/article12/docjdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、定制網(wǎng)站、建站公司、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容