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

配置集群专用的 KDC

您可以设置没有跨领域信任的集群,手动将 Linux 用户账户添加到所有集群节点,将 Kerberos 委托人添加到主节点上的 KDC 并确保客户端计算机已安装 Kerberos 客户端。

步骤 1:创建使用 Kerberos 的集群

  1. 创建启用 Kerberos 的安全配置。以下示例演示使用 AWS CLI 将安全配置指定为内联 JSON 结构的 create-security-configuration 命令。您也可以引用本地或 Amazon S3 中保存的文件。

    aws emr create-security-configuration --name MyKerberosConfig \ --security-configuration '{"AuthenticationConfiguration": {"KerberosConfiguration": \ {"Provider": "ClusterDedicatedKdc", "ClusterDedicatedKdcConfiguration": {"TicketLifeTimeInHours": 24}}}}}'
  2. 创建引用安全配置、指定集群的 Kerberos 属性并使用引导操作添加 Linux 账户的集群。以下示例演示使用 AWS CLI 的 create-cluster 命令。此命令引用您在上面创建的安全配置 MyKerberosConfig。它还引用一个简单脚本 createlinuxusers.sh 作为引导操作,这是您在创建集群之前创建并上传到 Amazon S3 的脚本。

    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 \ --bootstrap-actions Path=s3://mybucket/createlinuxusers.sh

    以下示例演示了 createlinuxusers.sh 脚本的内容,它将 user1、user2 和 user3 添加到集群中的每个节点。在下一个步骤中,您将这些用户添加为 KDC 委托人。

    #!/bin/bash sudo adduser user1 sudo adduser user2 sudo adduser user3

步骤 2:将委托人添加到 KDC、创建 HDFS 用户目录并配置 SSH

主节点上运行的 KDC 需要为本地主机和您在集群上创建的每个用户添加委托人。您还可以为每个用户创建 HDFS 目录 (如果他们需要连接到集群并运行 Hadoop 任务)。同样,配置 SSH 服务以启用 GSSAPI 身份验证,这是 Kerberos 所必需的。在启用 GSSAPI 后,重新启动 SSH 服务。

完成这些任务的最简单方法是向集群提交步骤。下面的示例将 bash 脚本 configurekdc.sh 提交到您在上一步中创建的集群,引用其集群 ID。该脚本会保存到 Amazon S3 中。或者,您可以使用 EC2 密钥对连接到主节点来运行命令或在集群创建过程中提交步骤。

aws emr add-steps --cluster-id j-01234567 --steps Type=CUSTOM_JAR,Name=CustomJAR,ActionOnFailure=CONTINUE,Jar=s3://myregion.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://mybucket/configurekdc.sh"]

以下示例演示了 configurekdc.sh 脚本的内容。

#!/bin/bash #Add a principal to the KDC for the master node, using the master node's returned host name sudo kadmin.local -q "ktadd -k /etc/krb5.keytab host/`hostname -f`" #Declare an associative array of user names and passwords to add declare -A arr arr=([user1]=pwd1 [user2]=pwd2 [user3]=pwd3) for i in ${!arr[@]}; do #Assign plain language variables for clarity name=${i} password=${arr[${i}]} # Create principal for sshuser in the master node and require a new password on first logon sudo kadmin.local -q "addprinc -pw $password +needchange $name" #Add user hdfs directory hdfs dfs -mkdir /user/$name #Change owner of user's hdfs directory to user hdfs dfs -chown $name:$name /user/$name done # Enable GSSAPI authentication for SSH and restart SSH service sudo sed -i 's/^.*GSSAPIAuthentication.*$/GSSAPIAuthentication yes/' /etc/ssh/sshd_config sudo sed -i 's/^.*GSSAPICleanupCredentials.*$/GSSAPICleanupCredentials yes/' /etc/ssh/sshd_config sudo /etc/init.d/sshd restart

步骤 3:使用 SSH 进行连接 (Linux 客户端计算机)

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

有关 SSH 连接的更多信息,请参阅连接到集群。您还必须已安装 Kerberos 客户端。

以下过程演示使用 ssh 命令 通过 Kerberos 从 Linux 客户端连接到 EMR 集群的步骤。

对于 MasterPublicDNS,请使用集群详细信息窗格的 Summary 选项卡上的 Master public DNS 所显示的值,例如,ec2-11-222-33-44.compute-1.amazonaws.com.

使用 SSH 从 Linux 客户端连接到使用 Kerberos 的 EMR 集群

  1. 使用 SSH 通过 EC2 密钥对连接到主节点并复制 /etc/krb5.conf 文件的内容。有关更多信息,请参阅 连接到集群

  2. 在用于连接到集群的每个客户端计算机上,基于上一步中制作的副本创建一个相同的 /etc/krb5.conf 文件。

  3. 每当用户从客户端计算机连接时,用户首先会续订 Kerberos 票证,如以下示例所示。

    kinit user1

    用户随后可以使用您之前创建的用户名和主节点的公有 DNS 名称,通过 ssh 进行连接,如以下示例所示。将 ec2-xx-xxx-xx-xx.compute-1.amazonaws.com 替换为集群的 Summary 页上列出的 Master public DNS 值。-K 选项指定 GSSAPI 身份验证。

    ssh -K user1@ec2-xx-xxx-xx-xx.compute-1.amazonaws.com