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

使用自定义 AMI

当您使用 Amazon EMR 5.7.0 或更高版本时,您可以选择针对 Amazon EMR 指定自定义 Amazon Linux AMI,而不是默认的 Amazon Linux AMI。如果您要执行以下操作,自定义 AMI 会非常有用:

  • 加密集群中的 EC2 实例的 EBS 根设备卷 (启动卷)。有关更多信息,请参阅创建带加密 Amazon EBS 根设备卷的自定义 AMI

    注意

    您不需要自定义 AMI 来加密实例存储和 EBS 存储卷。在使用适用于 Amazon EMR 的 Amazon Linux 或自定义 AMI 时,您可以使用 Amazon EMR 安全配置执行此操作。有关更多信息,请参阅 Amazon EMR 版本指南中的本地磁盘静态加密

  • 预安装应用程序并执行其他自定义设置,而不使用引导操作。这可缩短集群启动时间并简化启动工作流程。有关更多信息以及示例,请参阅 从预配置的实例创建自定义 Amazon Linux AMI

  • 实施比引导操作允许的集群和节点配置更高级的集群和节点配置。

最佳实践和注意事项

在为 Amazon EMR 创建自定义 AMI 时,请考虑以下事项:

  • 您必须使用一个 Amazon Linux AMI。不支持 Amazon Linux 2 AMI。仅支持 64 位 Amazon Linux AMI。不支持具有多个 Amazon EBS 卷的 Amazon Linux AMI。

  • 使您的自定义项基于由 EBS 支持的最新 Amazon Linux AMI。有关 Amazon Linux AMI 和对应 AMI ID 的列表,请参阅 Amazon Linux AMI

  • 请不要复制现有 Amazon EMR 实例的快照来创建自定义 AMI。这将导致错误。

  • 仅支持 HVM 虚拟化类型和与 Amazon EMR 兼容的实例。在您执行 AMI 自定义过程时,务必选择 HVM 映像和与 Amazon EMR 兼容的实例类型。有关兼容的实例和虚拟化类型,请参阅支持的实例类型

  • 您的服务角色在 AMI 上必须具有启动许可,因此 AMI 必须为公用 AMI,或者您必须是 AMI 的所有者或所有者已与您共享 AMI。

  • 在 AMI 上创建与应用程序同名的用户将导致错误 (例如,hadoophdfsyarnspark)。

  • /tmp/var/emr (如果它们存在于 AMI 上) 的内容将在启动时移至 /mnt/tmp/mnt/var/mnt/emr。文件将保留,但如果有大量数据,则启动时间可能长于预期时间。

  • 如果您使用基于 Amazon Linux AMI 的自定义 Amazon Linux AMI(创建日期为 2018 年 8 月 11 日),则 Oozie 服务器将无法启动。如果您使用 Oozie,则创建基于 Amazon Linux AMI ID 的自定义 AMI(具有其他创建日期)。您可以使用以下 AWS CLI 命令返回一个列表,其中包含所有 HVM Amazon Linux AMI 的映像 ID(2018 年 3 月版)和发布日期,以便您可以选择合适的 Amazon Linux AMI 作为基础。将 MyRegion 替换为您的区域标识符(如 us-west-2)。

    aws ec2 --region MyRegion describe-images --owner amazon --query 'Images[?Name!=`null`]|[?starts_with(Name, `amzn-ami-hvm-2018.03`) == `true`].[CreationDate,ImageId,Name]' --output text | sort -rk1

有关更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例)中的创建 Amazon EBS 支持的 Linux AMI

指定自定义 AMI

您可以在使用 AWS 管理控制台、AWS CLI、Amazon CloudWatch 或 Amazon EMR API 创建集群时指定自定义 AMI ID。AMI 必须位于创建集群的同一 AWS 区域中。

使用控制台指定自定义 AMI

  1. 通过以下网址打开 Amazon EMR 控制台:https://console.amazonaws.cn/elasticmapreduce/

  2. Choose Create cluster, Go to advanced options.

  3. Software Configuration (软件配置) 下,对于 Release (发布),选择 emr-5.7.0 或更高版本,然后选择适合您的应用程序的其他选项。选择 Next (下一步)

  4. Hardware Configuration (硬件配置) 下,选择适合您的应用程序的值,然后选择 Next (下一步)

  5. Additional Options (其他选项) 下,对于 Custom AMI ID (自定义 AMI ID),输入一个值并使更新选项保持选中状态。有关更改更新选项的更多信息,请参阅管理 AMI 程序包存储库更新

    
                            Amazon EMR 自定义 AMI 选择。
  6. 要启动集群,请选择 Next (下一步) 并完成其他配置选项。

使用 AWS CLI 指定自定义 AMI

  • 在运行 --custom-ami-id 命令时,使用 aws emr create-cluster 参数可指定 AMI ID。

    以下示例指定一个将自定义 AMI 与 20 GiB 启动卷结合使用的集群。有关更多信息,请参阅 指定 Amazon EBS 根设备卷大小

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

    aws emr create-cluster --name "Cluster with My Custom AMI" \ --custom-ami-id MyAmiID --ebs-root-volume-size 20 \ --release-label emr-5.7.0 --use-default-roles \ --instance-count 2 --instance-type m4.large

管理 AMI 程序包存储库更新

在首次启动时,默认情况下,Amazon Linux AMI 将在其他服务启动之前连接到程序包存储库以安装安全更新。根据您的环境,在为 Amazon EMR 指定自定义 AMI 时,可以选择禁用这些更新。用于禁用此功能的选项仅在您使用自定义 AMI 时可用。

警告

我们强烈建议您在指定自定义 AMI 时选择重新启动以更新所有安装的程序包。选择不更新程序包将产生额外的安全风险。

通过使用AWS 管理控制台,您可在选择 Custom AMI ID (自定义 AMI ID) 时选择用于禁用更新的选项。

通过使用 AWS CLI,您可在使用 create-cluster 命令时指定 --repo-upgrade-on-boot NONE 以及 --custom-ami-id

通过使用 Amazon EMR API,您可以为 RepoUpgradeOnBoot 参数指定 NONE

从预配置的实例创建自定义 Amazon Linux AMI

预安装软件并执行其他配置以便为 Amazon EMR 创建自定义 Amazon Linux AMI 的基本步骤如下所示:

  • 从基础 Amazon Linux AMI 启动实例。

  • 连接到实例以安装软件和执行其他自定义操作。

  • 创建已配置实例的新映像 (AMI 快照)。

在基于自定义实例创建映像之后,您可将此映像复制到已加密的目标,如创建带加密 Amazon EBS 根设备卷的自定义 AMI中所述。

教程:从带有已安装自定义软件的实例创建 AMI

基于最新的 Amazon Linux AMI 启动 EC2 实例

  1. 使用 AWS CLI 运行以下命令,这将从现有 AMI 创建实例。将 MyKeyName 替换为连接到实例所用的密钥对,并将 MyAmiId 替换为相应的 Amazon Linux AMI 的 ID。有关最新的 AMI ID,请参阅 Amazon Linux AMI

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

    aws ec2 run-instances --image-id MyAmiID \ --count 1 --instance-type m4.large \ --key-name MyKeyName --region us-west-2

    InstanceId 输出值在下一步中用作 MyInstanceId

  2. 运行以下命令:

    aws ec2 describe-instances --instance-ids MyInstanceId

    PublicDnsName 输出值在下一步中用于连接到实例。

连接到实例并安装软件

  1. 使用可让您在 Linux 实例上运行 shell 命令的 SSH 连接。有关更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的使用 SSH 连接到您的 Linux 实例

  2. 执行任何所需的自定义操作。例如:

    sudo yum install MySoftwarePackage sudo pip install MySoftwarePackage

从自定义映像创建快照

创建带加密 Amazon EBS 根设备卷的自定义 AMI

要为 Amazon EMR 加密 Amazon Linux AMI 的 Amazon EBS 根设备卷,请将未加密的 AMI 中的快照映像复制到已加密的目标。有关创建加密 EBS 卷的信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例)中的 Amazon EBS 加密。快照的源 AMI 可以是基础 Amazon Linux AMI,您也可从派生自您自定义的基础 Amazon Linux AMI 的 AMI 复制快照。

此加密方法仅适用于 EBS 根设备卷。使用安全配置的本地磁盘加密功能 (Amazon EMR 4.8 版或更高版本) 加密 EBS 存储卷。有关更多信息,请参阅本地磁盘静态加密

您可以使用外部密钥提供程序或 AWS 客户主密钥 (CMK) 来加密 EBS 根卷。至少必须允许 Amazon EMR 使用的服务角色(通常为默认 EMR_DefaultRole)为 Amazon EMR 加密和解密卷,这样才能使用 AMI 创建集群。如果使用 AWS KMS 作为密钥提供程序,则意味着必须允许以下操作:

  • kms:encrypt

  • kms:decrypt

  • kms:ReEncrypt*

  • kms:CreateGrant

  • kms:GenerateDataKeyWithoutPlaintext"

  • kms:DescribeKey"

执行此操作的最简单方式是添加角色作为密钥用户,如以下教程中所述。如果您需要自定义角色策略,请参考以下示例策略语句。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EmrDiskEncryptionPolicy", "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:CreateGrant", "kms:GenerateDataKeyWithoutPlaintext", "kms:DescribeKey" ], "Resource": [ "*" ] } ] }

注意

使用安全配置的本地磁盘加密需要具有权限的 Amazon EMR 实例配置文件(通常为 EMR_EC2_DefaultRole)而不是 Amazon EMR 服务角色(通常为 EMR_DefaultRole)。您可以使用同一密钥来实现这两种目的,但服务角色和实例角色都必须附加为密钥策略用户。

教程:使用 KMS CMK 创建带加密根设备卷的自定义 AMI

此示例中的第一步是查找 KMS CMK 的 ARN 或创建新的 ARN。有关创建密钥的更多信息,请参阅 AWS Key Management Service Developer Guide 中的创建密钥。以下过程说明如何将默认服务角色 EMR_DefaultRole 作为密钥用户添加到密钥策略。当创建或编辑密钥时,记下密钥的 ARN 值。随后,在创建 AMI 时将使用此 ARN。

使用控制台将 Amazon EC2 的服务角色添加到加密密钥用户列表

  1. 登录 AWS 管理控制台并通过以下网址打开 AWS Key Management Service (AWS KMS) 控制台:https://console.amazonaws.cn/kms

  2. To change the AWS Region, use the Region selector in the upper-right corner of the page.

  3. 选择要使用的 CMK 的别名。

  4. 在密钥详细信息页面的 Key Users (密钥用户) 下,选择 Add (添加)

  5. Attach (附加) 对话框中,选择 Amazon EMR 服务角色。默认角色的名称为 EMR_DefaultRole

  6. 选择 Attach (附加)

使用 AWS CLI 创建加密的 AMI

  • 在 AWS CLI 中使用 aws ec2 copy-image 命令创建具有加密 EBS 根设备卷和已修改的密钥的 AMI。将指定的 --kms-key-id 值替换为您之前创建或修改的密钥的完整 ARN。

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

    aws ec2 copy-image --source-image-id MyAmiId \ --source-region us-west-2 --name MyEncryptedEMRAmi \ --encrypted --kms-key-id arn:aws:kms:us-west-2:12345678910:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

此命令的输出将提供您创建的 AMI 的 ID (可在创建集群时指定此 ID)。有关更多信息,请参阅 指定自定义 AMI。您也可选择通过安装软件并执行其他配置来自定义此 AMI。有关更多信息,请参阅 从预配置的实例创建自定义 Amazon Linux AMI