Amazon EMR
管理指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

配置跨领域信任

在您设置跨领域信任时,允许来自不同 Kerberos 领域的委托人 (通常为用户) 对 EMR 集群上的应用程序组件进行身份验证。集群专用的 KDC 与另一个 KDC 建立信任关系时所使用的是这两个 KDC 中都存在的跨领域委托人。委托人名称和密码精确匹配。

跨领域信任要求 KDC 可以通过网络相互访问并解析对方的域名。下面提供了与作为 EC2 实例运行的 Microsoft AD 域控制器建立跨领域信任关系的步骤,以及提供所需连接和域名解析的示例网络设置。

设置与 Active Directory 域控制器的跨领域信任

步骤 1:设置 VPC 和子网

步骤 2:启动并安装 Active Directory 域控制器

步骤 3:将用户账户添加到 EMR 集群的域中

步骤 4:在 Active Directory 域控制器上配置传入信任

步骤 5:使用 DHCP 选项集指定 Active Directory 域控制器作为 VPC DNS 服务器

步骤 6:启动使用 Kerberos 的 EMR 集群

步骤 7:在集群上为 Active Directory 用户账户创建 HDFS 用户并设置权限

步骤 8:使用 SSH 登录到集群

步骤 1:设置 VPC 和子网

以下步骤演示如何创建 VPC 和子网,以便集群专用的 KDC 可以访问 Active Directory 域控制器并解析其域名。在这些步骤中,通过引用 Active Directory 域控制器作为 DHCP 选项集中的域名服务器来提供域名解析。有关更多信息,请参阅 步骤 5:使用 DHCP 选项集指定 Active Directory 域控制器作为 VPC DNS 服务器

KDC 和 Active Directory 域控制器必须能够解析对方的域名。这样,Amazon EMR 才能将计算机加入域并自动配置集群实例上的相应 Linux 用户账户和 SSH 参数。

如果 Amazon EMR 无法解析域名,您可以使用 Active Directory 域控制器的 IP 地址来引用信任。但是,您必须手动添加 Linux 用户账户、将相应委托人添加到集群专用的 KDC 并配置 SSH。

设置 VPC 和子网

  1. 创建带单个公有子网的 Amazon VPC。有关更多信息,请参阅 Amazon VPC Getting Started Guide 中的步骤 1:创建 VPC

    重要

    当您使用 Microsoft Active Directory 域控制器时,请为 EMR 集群选择 CIDR 块,以便所有 IPv4 地址的长度少于 9 个字符 (例如,10.0.0.0/16)。这是因为在计算机加入 Active Directory 目录时会使用集群计算机的 DNS 名称。AWS 基于 IPv4 地址分配 DNS 主机名,这样,较长的 IP 地址可能会导致 DNS 名称长度超过 15 个字符。在注册已加入的计算机名称时,Active Directory 具有 15 个字符的限制,并且将截断较长的名称,这可能会导致不可预测的错误。

  2. 删除分配给 VPC 的默认 DHCP 选项集。有关更多信息,请参阅更改 VPC 以使用 NO DHCP 选项。稍后,添加一个指定 Active Directory 域控制器作为 DNS 服务器的新 DHCP 选项集。

  3. 确认已为 VPC 启用了 DNS 支持,也就是说,同时启用了 DNS 主机名和 DNS 解析。默认处于启用状态。有关详细信息,请参阅更新您的 VPC 的 DNS 支持

  4. 确认您的 VPC 已附加 Internet 网关,这是默认设置。有关更多信息,请参阅创建并附加 Internet 网关

    注意

    此示例中使用 Internet 网关是因为您将为 VPC 建立新的域控制器。您的应用程序可能不需要 Internet 网关。唯一的要求是,集群专用的 KDC 可以访问 Active Directory 域控制器。

  5. 创建自定义路由表,添加目标为 Internet 网关的路由,然后将其附加到您的子网。有关更多信息,请参阅创建自定义路由表

  6. 在您启动域控制器的 EC2 实例时,它必须具有静态公有 IPv4 地址,您才能使用 RDP 连接到它。执行此操作的最简单方法是将您的子网配置为自动分配公有 IPv4 地址。这不是创建子网时的默认设置。有关更多信息,请参阅修改子网的公有 IPv4 寻址属性。也可以选择在启动实例时分配地址。有关更多信息,请参阅在实例启动期间分配公有 IPv4 地址

  7. 完成后,记下您的 VPC 和子网 ID。稍后,您在启动 Active Directory 域控制器和集群时会使用它们。

步骤 2:启动并安装 Active Directory 域控制器

  1. 基于 Microsoft Windows Server 2016 Base AMI 启动 EC2 实例。我们推荐 m4.xlarge 或更好的实例类型。有关更多信息,请参阅 Amazon EC2 User Guide for Windows Instances 中的启动 AWS Marketplace 实例

  2. 使用 RDP 连接到 EC2 实例。有关更多信息,请参阅 Amazon EC2 User Guide for Windows Instances 中的连接到您的 Windows 实例

  3. 启动服务器管理器来在服务器上安装并配置 Active Directory 域服务角色。将服务器提升为域控制器并分配域名 (我们在此处使用的示例是 ad.domain.com)。请记下该域名,因为稍后您创建 EMR 安全配置和集群时会需要它。如果您并不熟悉如何设置 Active Directory,可以按照如何在 Windows Server 2016 中设置 Active Directory (AD) 中的说明操作。

    在您完成后,实例会重新启动。

步骤 3:将用户账户添加到 EMR 集群的域中

使用 RDP 连接到 Active Directory 域控制器以在 Active Directory 用户和计算机中为每个集群用户创建用户账户。有关说明,请参阅在 Active Directory 用户和计算机中创建用户账户。请记下每个用户的用户登录名。稍后,在您配置集群时会需要这些信息。

另外,创建具有将计算机加入域的足够权限的用户账户。在您创建集群时指定此账户。Amazon EMR 使用它将集群实例加入域。在步骤 6:启动使用 Kerberos 的 EMR 集群 中指定此账户及其密码。要将计算机加入权限委派给用户账户,我们建议您创建具有加入权限的组,然后将用户分配到该组。有关说明,请参阅 AWS Directory Service Administration Guide 中的委派目录加入权限

步骤 4:在 Active Directory 域控制器上配置传入信任

下面的示例命令在 Active Directory 中创建信任,这是使用集群专用的 KDC 的单向、传入、不可传递的领域信任。我们对集群的领域使用的示例为 EC2.INTERNALpasswordt 参数指定跨领域委托人密码,您在创建集群时指定了它以及集群领域。领域名称派生自 us-east-1 中集群的默认域名。Domain 是您正在创建信任的 Active Directory 域,按照惯例,它是小写的。此示例使用 ad.domain.com

使用管理员权限打开 Windows 命令提示符并键入以下命令,在 Active Directory 域控制器上创建信任关系:

C:\Users\Administrator> ksetup /addkdc EC2.INTERNAL C:\Users\Administrator> netdom trust EC2.INTERNAL /Domain:ad.domain.com /add /realm /passwordt:MyVeryStrongPassword C:\Users\Administrator> ksetup /SetEncTypeAttr EC2.INTERNAL AES256-CTS-HMAC-SHA1-96

步骤 5:使用 DHCP 选项集指定 Active Directory 域控制器作为 VPC DNS 服务器

现在已配置 Active Directory 域控制器,您必须配置 VPC 以使用它作为您的 VPC 内的域名服务器来解析名称。为此,请附加 DHCP 选项集。指定 Domain name 作为您的集群的域名,例如,ec2.internal (如果您的集群位于 us-east-1 中) 或 region.compute.amazon.aws (对于其他区域)。对于 Domain name servers,您必须将 Active Directory 域控制器的 IP 地址 (必须可从集群访问) 指定为第一个条目,后跟 AmazonProvidedDNS (例如,xx.xx.xx.xx,AmazonProvidedDNS)。有关更多信息,请参阅更改 DHCP 选项集

步骤 6:启动使用 Kerberos 的 EMR 集群

  1. 在 Amazon EMR 中创建安全配置,指定您在之前的步骤中创建的 Active Directory 域控制器。下面显示了一个示例命令。将域 ad.domain.com 替换为您在步骤 2:启动并安装 Active Directory 域控制器 中指定的域的名称。

    aws emr create-security-configuration --name MyKerberosConfig \ --security-configuration '{ "AuthenticationConfiguration": { "KerberosConfiguration": { "Provider": "ClusterDedicatedKdc", "ClusterDedicatedKdcConfiguration": { "TicketLifetimeInHours": 24, "CrossRealmTrustConfiguration": { "Realm": "AD.DOMAIN.COM", "Domain": "ad.domain.com", "AdminServer": "ad.domain.com", "KdcServer": "ad.domain.com" } } } } }'
  2. 创建集群,指定安全配置 (在本示例中为 MyKerberosConfig) 和您在步骤 1:设置 VPC 和子网 中创建的同一子网。

    还指定以下特定于集群的 kerberos-attributes

    以下示例启动使用 Kerberos 的集群。

    aws emr create-cluster --name "MyKerberosCluster" \ --release-label emr-5.10.0 \ --instance-type m4.large \ --instance-count 3 \ --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=MyEC2KeyPair \ --service-role EMR_DefaultRole \ --security-configuration MyKerberosConfig \ --applications Name=Hadoop Name=Hive Name=Oozie Name=Hue Name=HCatalog Name=Spark \ --kerberos-attributes Realm=EC2.INTERNAL,\ KdcAdminPassword=MyClusterKDCAdminPwd,\ ADDomainJoinUser=ADUserLogonName,ADDomainJoinPassword=ADUserPassword,\ CrossRealmTrustPrincipalPassword=MatchADTrustPwd

步骤 7:在集群上为 Active Directory 用户账户创建 HDFS 用户并设置权限

在设置与 Active Directory 的信任关系时,Amazon EMR 将在集群上为每个 Active Directory 用户账户创建 Linux 用户。例如,Active Directory 中的用户登录名 LiJuan 具有 Linux 用户账户 lijuan。Active Directory 用户名可以包含大写字母,但 Linux 不区分 Active Directory 大小写。

要允许您的用户登录到集群来运行 Hadoop 任务,您必须为其 Linux 用户账户添加 HDFS 用户目录,并为每个用户授予对其目录的所有权。为此,我们建议您运行以集群步骤的形式保存到 Amazon S3 的脚本。或者,您也可以从主节点上的命令行运行以下脚本中的命令。使用您在创建集群时指定的 EC2 密钥对以 Hadoop 用户身份通过 SSH 连接到主节点。有关更多信息,请参阅 对 SSH 凭证使用 Amazon EC2 密钥对

运行以下命令来将步骤添加到运行脚本 AddHDFSUsers.sh 的集群中。

aws emr add-steps --cluster-id ClusterID \ --steps Type=CUSTOM_JAR,Name=CustomJAR,ActionOnFailure=CONTINUE,\ Jar=s3://MyRegion.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://MyBucketPath/AddHDFSUsers.sh"]

文件 AddHDFSUsers.sh 的内容如下所示。

#!/bin/bash # AddHDFSUsers.sh script # Initialize an array of user names from AD ADUSERS=("lijuan" "marymajor" "richardroe" "myusername") # For each user listed, create an HDFS user directory # and change ownership to the user for username in ${ADUSERS[@]}; do hdfs dfs -mkdir /user/$username hdfs dfs -chown $username:$username /user/$username done

映射到 Hadoop 组的 Active Directory 组

Amazon EMR 使用 System Security Services Daemon (SSD) 将 Active Directory 组映射到 Hadoop 组。要确认组映射,在您按以下步骤中所述登录到主节点后,可以使用 hdfs groups 命令确认您的 Active Directory 账户所属的 Active Directory 组是否已映射到集群上相应 Hadoop 用户的 Hadoop 组。您还可以使用命令 (例如 hdfs groups lijuan),通过指定一个或多个用户名来查看其他用户的组映射。有关更多信息,请参阅 Apache HDFS 命令指南中的

步骤 8:使用 SSH 登录到集群

Active Directory 域中的用户现在应该能够使用其域凭证登录到集群。Linux 用户可以如下例所示,使用 ssh 进行连接。将 myusername 替换为 Active Directory 中的用户登录名。将 ec2-xx-xxx-xx-xx.compute-1.amazonaws.com 替换为集群的 Summary 页上列出的 Master public DNS 值。

myusername@ec2-xx-xxx-xx-xx.compute-1.amazonaws.com

默认情况下,您的 Linux 计算机最可能包括 SSH 客户端。例如,大多数 Linux、Unix 和 macOS 操作系统上都会安装 OpenSSH。您可以通过在命令行键入 ssh 来检查 SSH 客户端。如果您的计算机无法识别该命令,请安装 SSH 客户端以便连接主节点。OpenSSH 项目会免费提供一套完整的 SSH 工具执行文件。有关更多信息,请访问 OpenSSH 网站。

同样,Windows 用户可以使用 PuTTY,为 Host Name 指定 myusername@ec2-xx-xxx-xx-xx.compute-1.amazonaws.com。确保 ConnectionSSHAuthGSSAPI 下的默认 Attempt GSSAPI Authentication 仍处于启用状态。

有关 SSH 连接的更多信息,请参阅连接到集群