E-MapReduce 中的 Kerberos 支持跨域访问(cross-realm),即不同的 Kerberos 集群之间可以互相访问。

下面以 Cluster-A 跨域去访问 Cluster-B 中的服务为例:

  • Cluster-A 的 emr-header-1 的 hostname -> emr-header-1.cluster-1234 ; realm -> EMR.1234.COM
  • Cluster-B的 emr-header-1 的 hostname -> emr-header-1.cluster-6789 ; realm -> EMR.6789.COM
  • 说明
    • hostname 可以在 emr-header-1 上面执行命令 hostname 获取
    • realm 可以在 emr-header-1 上面的 /etc/krb5.conf 获取

添加 principal

Cluster-A 和 Cluster-B 两个集群的 emr-header-1 节点分别执行以下完全一样的命令:

# root账号
       sh /usr/lib/has-current/bin/hadmin-local.sh /etc/ecm/has-conf -k /etc/ecm/has-conf/admin.keytab
       HadminLocalTool.local: addprinc -pw 123456 krbtgt/EMR.6789.COM@EMR.1234.COM
说明
  • 123456 是密码,可自行修改
  • EMR.6789.COM 是 Cluster-B 的 realm,即被访问的集群的 realm
  • EMR.1234.COM 是 Cluster-A 的 realm,即发起访问的集群 realm

配置 Cluster-A 的 /etc/krb5.conf

在 Cluster-A 集群上配置 [realms]/[domain_realm]/[capaths],如下所示:

[libdefaults]
    kdc_realm = EMR.1234.COM
    default_realm = EMR.1234.COM
    udp_preference_limit = 4096
    kdc_tcp_port = 88
    kdc_udp_port = 88
    dns_lookup_kdc = false
[realms]
    EMR.1234.COM = {
                kdc = 10.81.49.3:88
    }
    EMR.6789.COM = {
                kdc = 10.81.49.7:88
    }
[domain_realm]
    .cluster-1234 = EMR.1234.COM
    .cluster-6789 = EMR.6789.COM
[capaths]
    EMR.1234.COM = {
       EMR.6789.COM = .
    }
    EMR.6789.COM = {
       EMR.1234.COM = .
    }
将上述 /etc/krb5.conf 同步到 Cluster-A 所有节点

将 Cluster-B 节点的 /etc/hosts 文件中绑定信息(只需要长域名 emr-xxx-x.cluster-xxx)拷贝复制到 Cluster-A 的所有节点 /etc/hosts

10.81.45.89  emr-worker-1.cluster-xxx
 10.81.46.222  emr-worker-2.cluster-xx
 10.81.44.177  emr-header-1.cluster-xxx
说明
  • Cluster-A 上面如果要跑作业访问 Cluster-B,需要先重启 yarn
  • Cluster-A 的所有节点配置 Cluster-B 的 host 绑定信息

访问 Cluster-B 服务

在 Cluster-A 上面可以用 Cluster-A 的 Kerberos 的 keytab 文件 /ticket 缓存,去访问 Cluster-B 的服务。

如访问 Cluster-B 的 hdfs 服务:

su has;
hadoop fs -ls hdfs://emr-header-1.cluster-6789:9000/
Found 4 items
-rw-r-----   2 has    hadoop         34 2017-12-05 18:15 hdfs://emr-header-1.cluster-6789:9000/abc
drwxrwxrwt   - hadoop hadoop          0 2017-12-05 18:32 hdfs://emr-header-1.cluster-6789:9000/spark-history
drwxrwxrwt   - hadoop hadoop          0 2017-12-05 17:53 hdfs://emr-header-1.cluster-6789:9000/tmp
drwxrwxrwt   - hadoop hadoop          0 2017-12-05 18:24 hdfs://emr-header-1.cluster-6789:9000/user