datanode节点在启动的时候,有一个向namenode注册的过程,那么注册的过程中datanode到底向namenode传递了哪些信息?
private void register() throws IOException {
if (dnRegistration.getStorageID().equals("")) {
setNewStorageID(dnRegistration);
}
while(shouldRun) {
try {
// reset name to machineName. Mainly for web interface.
dnRegistration.name = machineName + ":" + dnRegistration.getPort();
dnRegistration = namenode.register(dnRegistration);//dnRegistration
break;
} catch(SocketTimeoutException e) { // namenode is busy
LOG.info("Problem connecting to server: " + getNameNodeAddr());
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {}
}
}
dnRegistration对象封装了datanode的注册信息,datanode初始化的时候创建一个DatanodeRegistration实例,我们看是传进去了机器名和端口号。
this.dnRegistration = new DatanodeRegistration(machineName + ":" + tmpPort);
啥是机器名?
if (conf.get("slave.host.name") != null) {
machineName = conf.get("slave.host.name");
}
if (machineName == null) {
machineName = DNS.getDefaultHost(
conf.get("dfs.datanode.dns.interface","default"),
conf.get("dfs.datanode.dns.nameserver","default"));
}
看到没有,机器名你可以手工配置key就叫slave.host.name,但是这个多数都不配,因为对于大规模集群来说,一个个节点去配置机器名是很没效率的。
所以datanode怎么获取呢,一种方式是找dns要,但是一般也不配置dns,因为这样又把dns服务牵扯进来,有些集群的数据节点没有配置dns或者dns压力比较大,所以基本上都不配置dfs.datanode.dns.interface或者dfs.datanode.dns.nameserver,查看hdfs-default.xml可以看出都是default,那下面还有啥办法?我擦只能找hosts了,就是本机配置的/etc/hosts文件,这里里边建立了ip和机器名的对应关系,一般的例如hosts文件你可以这样配置:
127.0.0.1 YZSJHL19-87 localhost.localdomain localhost
10.4.19.87 YZSJHL19-87.opi.com
public static String getDefaultHost(String strInterface, String nameserver)
throws UnknownHostException {
if (strInterface.equals("default"))
return InetAddress.getLocalHost().getCanonicalHostName();
if (nameserver != null && nameserver.equals("default"))
return getDefaultHost(strInterface);
String[] hosts = getHosts(strInterface, nameserver);
return hosts[0];
}
然后看上面返回的结果是啥,第一个if就返回了,返回结果是string类型的机器名即YZSJHL19-87.opi.com,InetAddress.getLocalHost()返回的结果如下
YZSJHL19-87.opi.com/10.4.19.87,也就说你使用shell命令行显示的机器名是啥,dn往namenode注册的机器名就是啥。
好了,现在看看端口号是什么,就是前面提到的tmpPort,
<