美文网首页数客联盟
principal name中为什么使用_HOST

principal name中为什么使用_HOST

作者: Woople | 来源:发表于2018-05-30 09:16 被阅读87次

以hadoop为例,其他hbase或者hive等组件一样的原理,dfs.datanode.kerberos.principal的值为dn/_HOST@WOOPLE.COM,那么这里principal为什么要使用_HOST,可以参考官方的HADOOP-6632或者HADOOP-8098。

源码分析

本文源码基于hadoop2.7.2,简言之,在运行时会动态的将_HOST替换为所在主机的hostname。
SecurityUtil.java中,下面的方法会替换_HOST

  public static String getServerPrincipal(String principalConfig,
      InetAddress addr) throws IOException {
    String[] components = getComponents(principalConfig);
    if (components == null || components.length != 3
        || !components[1].equals(HOSTNAME_PATTERN)) {
      return principalConfig;
    } else {
      if (addr == null) {
        throw new IOException("Can't replace " + HOSTNAME_PATTERN
            + " pattern since client address is null");
      }
      return replacePattern(components, addr.getCanonicalHostName());
    }
  }

再看一下如何获取主机的hostname

  private static String replacePattern(String[] components, String hostname)
      throws IOException {
    String fqdn = hostname;
    if (fqdn == null || fqdn.isEmpty() || fqdn.equals("0.0.0.0")) {
      fqdn = getLocalHostName();
    }
    return components[0] + "/" +
        StringUtils.toLowerCase(fqdn) + "@" + components[2];
  }

最终下面的方法获取到机器的hostname,将_HOST替换掉

  static String getLocalHostName() throws UnknownHostException {
    return InetAddress.getLocalHost().getCanonicalHostName();
  }

总结

在多实例的组件中,例如nodemanager或者datanode等,它们的principal name中一般都带有_HOST,在运行时会根据各个实例所在节点的真实的hostname将_HOST替换掉,保证了每个节点使用的是自己主机实例的principal。

相关文章

网友评论

  • 山_b0f3:这写的不清楚,你只是说了在内部什么地方解析,但是没说为什么😣
    Woople:山哥你是kerberos专家啊,呵呵,我确实对kerberos理解的不深,有时间帮忙给补充一下呗:smiley:

本文标题:principal name中为什么使用_HOST

本文链接:https://www.haomeiwen.com/subject/iazzjftx.html