hbase執行mapreduce任務報dns異常

    在最近的一個項目中有這樣一個需求,咱們的業務數據是存放在hbase中,一天大概新增五到六百萬的,而後我這邊須要作一件事是按小時把新增數據加載到impala中,而且數據須要按年月日三個字段分區。
java

    起初想到的是直接在hive中創建一個表,而後在表上創建一個mapping映射到hbase中的表。可是考慮到分區,業務表中沒法提供這些字段,因此另想它法。數據庫

    後來想到的是用hbase中提供的TableMapper按時間截掃描(這裏不用rowkey緣由能夠本身思考,時間截會出現的問題,業務那邊已經處理),mapreduce任務定時每隔一小時執行一次,每次記錄下掃描到的數據的最大和最小時間截。下次依據這個掃描最新數據,而後經過reduce把數據寫到hdfs上,最後load到impala上。服務器

    按照上面的思路敲完代碼測試的時候,在log中發現一個error,以下圖app

    經過源碼找到報錯的地方dom

InetAddress regionAddress = isa.getAddress();
String regionLocation;
try {
	regionLocation = reverseDNS(regionAddress);
} catch (NamingException e) {
	LOG.warn("Cannot resolve the host name for " + regionAddress + " because of " + e);
	regionLocation = location.getHostname();
}

     拋出異常的方法reverseDNS測試

private String reverseDNS(InetAddress ipAddress) throws NamingException {
	String hostName = this.reverseDNSCacheMap.get(ipAddress);
	if (hostName == null) {
		hostName = Strings.domainNamePointerToHostName(DNS.reverseDns(ipAddress, this.nameServer));
		this.reverseDNSCacheMap.put(ipAddress, hostName);
	}
	return hostName;
}

    可見hostName的獲取是與nameServer有關this

this.nameServer = context.getConfiguration().get("hbase.nameserver.address", null);

    而nameServer是從配置(hbase-site.xml)中讀取的,hbase.nameserver.address從字面上看是名字服務器的地址,也就是域名服務器。spa

try {
	regionLocation = reverseDNS(regionAddress);
} catch (NamingException e) {
	LOG.warn("Cannot resolve the host name for " + regionAddress + " because of " + e);
	regionLocation = location.getHostname();
}

    在分析這裏,首先根據region所在的regionserver的ip地址去域名服務器中找這個regionserver的主機名,而咱們搭建本地集羣通常不會去弄個域名服務器什麼的,這裏固然會找不到,而後纔會去hosts文件獲取regionserver的主機名。總之這裏仍是獲取到了regionserver的主機名,沒有獲取到想要的主機域名,不影響mapreduce的執行。code

    只有在線上集羣,咱們可能會申請一個域名,而後爲每一個節點 的ip映射一個二級域名,而後在hbase-site.xml中配置上hbase.nameserver.address的值爲一個域名服務器的ip(好比114.114.114.114)。server

    因此不想看到這個error:一、能夠本身在一個節點上搭建一個域名服務器,而後再域名服務器的數據庫中按hosts的配置添加映射;二、修改源碼註釋這行代碼,覆蓋到集羣中

相關文章
相關標籤/搜索