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

教程:配置与 Active Directory 域的跨领域信任

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

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

(可选)在使用一个集群上的 KDC 建立与 Active Directory 的跨领域信任之后,您可以使用不同安全配置创建另一个集群,引用第一个集群上的 KDC 作为外部 KDC。有关示例安全配置和集群设置,请参阅外部集群 KDC 与 Active Directory 跨领域信任

重要

Amazon EMR 不支持使用 AWS Directory Service for Microsoft 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 用户并设置权限

步骤 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 入门指南中的步骤 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 用户指南(适用于 Windows 实例)中的启动 AWS Marketplace 实例

  2. 记下与 EC2 实例关联的安全组的组 ID。您将在 步骤 6:启动使用 Kerberos 的 EMR 集群中需要它。我们使用 sg-012xrlmdomain345。或者,您可以为 EMR 集群指定不同的安全组,并指定允许安全组之间流量的此实例。有关更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的适用于 Linux 实例的 Amazon EC2 安全组

  3. 使用 RDP 连接到 EC2 实例。有关更多信息,请参阅 Amazon EC2 用户指南(适用于 Windows 实例) 中的连接到您的 Windows 实例

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

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

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

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

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

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

下面的示例命令在 Active Directory 中创建信任,这是使用集群专用的 KDC 的单向、传入、不可传递的领域信任。我们对集群的领域使用的示例为 EC2.INTERNALpasswordt 参数指定 cross-realm principal password (跨领域委托人密码),您在创建集群时指定了它以及集群 realm (领域)。领域名称派生自 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. 使用下面的属性创建集群:

    • 使用 --security-configuration 选项指定您创建的安全配置。在本例中我们使用 MyKerberosConfig

    • 使用 --ec2-attributes optionSubnetId 属性来指定您在 步骤 1:设置 VPC 和子网 中创建的子网。在本例中我们使用 step1-subnet

    • 使用 --ec2-attributes 选项的 AdditionalMasterSecurityGroupsAdditionalSlaveSecurityGroups,指定与 步骤 2:启动并安装 Active Directory 域控制器 中的 AD 域控制器关联的安全组与集群主节点以及核心节点和任务节点相关联。在本例中我们使用 sg-012xrlmdomain345

    使用 --kerberos-attributes 指定以下特定于集群的 Kerberos 属性:

    以下示例启动使用 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,\ SubnetId=step1-subnet, AdditionalMasterSecurityGroups=sg-012xrlmdomain345, AdditionalSlaveSecurityGroups=sg-012xrlmdomain345\ --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 or Linux users and KDC principals created manually on the cluster 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 组。要确认组映射,在您按通过 SSH 连接使用 Kerberos 的集群中所述登录到主节点后,可以使用 hdfs groups 命令确认您的 Active Directory 账户所属的 Active Directory 组是否已映射到集群上相应 Hadoop 用户的 Hadoop 组。您还可以使用命令 (例如 hdfs groups lijuan),通过指定一个或多个用户名来查看其他用户的组映射。有关更多信息,请参阅 Apache HDFS 命令指南中的