【HDFS】datanode注册信息都有啥?

本文详细介绍了HDFS中DataNode在启动时向NameNode注册的过程,包括DataNode如何获取自身信息,如通过hosts文件确定节点名和端口号,以及注册时所需的存储ID。此外,还讨论了DataNode在注册时与NameNode的握手认证、数据盘的VERSION信息检查和格式化,以及DataNodeID对象中的关键信息。
摘要由CSDN通过智能技术生成

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,

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值