datanode域名
hadoop版本2.6.5
当前集群的的/etc/hosts文件中每个节点均配置了短域名和长域名,hosts文件每行记录的格式为“IP 域名 域名别名”,datanode节点在启动时会获取当前节点的域名,代码如下:
org.apache.hadoop.net.DNS#resolveLocalHostname
private static String resolveLocalHostname() {
String localhost;
try {
localhost = InetAddress.getLocalHost().getCanonicalHostName();
} catch (UnknownHostException e) {
LOG.warn("Unable to determine local hostname "
+ "-falling back to "" + LOCALHOST + """, e);
localhost = LOCALHOST;
}
return localhost;
}
注意getCanonicalHostName获取到的是域名,即我们配置的短域名,如果使用的是InetAddress.getLocalHost().getHostName(),则会获取到长域名,目前集群中长域名是配置了dns的,客户端不需要在本地配置hosts文件即可使用webhdfs,否则由于在访问webhds时返回的是短域名,而短域名没有配置dns,这就导致客户端必须在/etc/hosts中配置集群各节点的host。
解决方案:
在resolveLocalHostname方法的上游调用链中发现程序先会从配置文件中查找hostname配置,代码如下:
DataNode#getHostName
private static String getHostName(Configuration config)
throws UnknownHostException {
String name = config.get(DFS_DATANODE_HOST_NAME_KEY);
if (name == null) {
name = DNS.getDefaultHost(
config.get(DFS_DATANODE_DNS_INTERFACE_KEY,
DFS_DATANODE_DNS_INTERFACE_DEFAULT),
config.get(DFS_DATANODE_DNS_NAMESERVER_KEY,
DFS_DATANODE_DNS_NAMESERVER_DEFAULT));
}
return name;
}
因此可以在每台datanode的hdfs-site.xml中配置本机的hostname为长域名,配置项为dfs.datanode.hostname
如:
<property>
<name>dfs.datanode.hostname</name>
<value>xxx.intranet.test01.tj1</value>
</property>