使用自定义 AMI - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用自定义 AMI

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

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

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

  • 如果您使用的 Amazon EMR 版本早于 5.24.0,则加密集群中的 EC2 实例的 EBS 根设备卷(引导卷)。与默认 AMI 一样,自定义 AMI 的最小根卷大小为 10 GiB。有关更多信息,请参阅 使用加密的 Amazon EBS 根设备卷创建自定义 AMI

    注意

    从 Amazon EMR 5.24.0 开始,您可以使用安全配置选项来加密 EBS 根设备和存储卷,当您指定Amazon KMS作为密钥提供程序。有关更多信息,请参阅 本地磁盘加密

重要

运行亚马逊 Linux 或 Amazon Linux 2 AMI(亚马逊 Linux 计算机映像)的 Amazon EMR 集群使用默认的 Amazon Linux 行为,并且不会自动下载和安装需要重新启动的重要和关键的内核更新。这与运行默认 Amazon Linux AMI 的其他 Amazon EC2 实例的行为相同。如果在 Amazon EMR 版本发布后需要重新启动的新 Amazon Linux 软件更新(如内核、NVIDIA 和 CUDA 更新)变为可用,则运行默认 AMI 的 Amazon EMR 集群实例不会自动下载和安装这些更新。要获取内核更新,您可以自定义您的亚马逊 EMR AMI使用最新的 Amazon Linux AMI.

最佳实践和注意事项

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

  • 对于 Amazon EMR 5.30.0 及更高版本,以及 Amazon EMR 6.x 系列基于 Amazon Linux 2。对于这些 EMR 版本,您需要对自定义 AMI 使用基于 Amazon Linux 2 的映像。要查找基本自定义 AMI,请参阅查找 Linux AMI

  • 对于 5.30.0 和 6.x 之前的 Amazon EMR 版本,不支持 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分别在启动过程中。文件将保留,但如果有大量数据,则启动时间可能长于预期时间。

  • 如果您使用基于亚马逊 Linux AMI 的自定义亚马逊 Linux AMI,创建日期为 2018-08-11,则 Oozie 服务器无法启动。如果您使用 Oozie,请根据具有不同创建日期的亚马逊 Linux AMI ID 创建自定义 AMI。您可以使用以下命令Amazon CLI命令返回所有具有 2018.03 版本的 HVMAmazon Linux AMI 的映像 ID 列表以及发布日期,以便您可以选择适当的亚马逊 Linux AMI 作为您的基础。将 myRegition 替换为您的区域标识符,如 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
  • 如果您使用带有非标准域名和 AmazonProvidedDNS 的 VPC,则不应使用rotate选项中的操作系统 DNS 配置。

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

指定自定义 AMI

您可以在使用Amazon Web Services Management Console、Amazon CLI、Amazon CloudWatch或亚马逊 EMR API。AMI 必须位于同一Amazon您创建集群的区域。

使用控制台指定自定义 AMI

  1. 从打开 Amazon EMR 控制台https://console.aws.amazon.com/elasticmapreduce/.

  2. 依次选择 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 (下一步) 并完成其他配置选项。

使用 Amazon 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 m5.xlarge

管理 AMI 包存储库更新

在首次启动时,默认情况下,Amazon Linux AMI 将在其他服务启动之前连接到程序包存储库以安装安全更新。根据您的要求,在为 Amazon EMR 指定自定义 AMI 时,可以选择禁用这些更新。用于禁用此功能的选项仅在您使用自定义 AMI 时可用。默认情况下,Amazon Linux 内核更新和需要重新启动的其他软件包不会更新。请注意,您的网络配置必须允许将 HTTP 和 HTTPS 输出到 Amazon S3 中的 Amazon Linux 存储库,否则安全更新将无法成功。

警告

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

通过使用Amazon Web Services Management Console,您可在选择 Custom AMI ID (自定义 AMI ID) 时选择用于禁用更新的选项。

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

使用亚马逊 EMR API,您可以指定NONE(对于 )RepoUpgradeOnBoot参数。

从预配置的实例创建自定义亚马逊 Linux AMI

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

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

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

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

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

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

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

  1. 使用 Amazon 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 m5.xlarge \ --key-name MyKeyName --region us-west-2

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

  2. 运行以下命令:

    aws ec2 describe-instances --instance-ids MyInstanceId

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

连接到实例并安装软件

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

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

    sudo yum install MySoftwarePackage sudo pip install MySoftwarePackage

从自定义映像创建快照

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

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

注意

从 Amazon EMR 5.24.0 开始,您可以使用安全配置选项来加密 EBS 根设备和存储卷,当您指定Amazon KMS作为密钥提供程序。有关更多信息,请参阅 本地磁盘加密

您可以使用外部密钥提供程序或AmazonKMS 密钥来加密 EBS 根卷。Amazon EMR 使用的服务角色(通常是默认的EMR_DefaultRole)必须允许至少为 Amazon EMR 加密和解密卷,这样才能使用 AMI 创建群集。如果使用 Amazon 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": [ "*" ] } ] }

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

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

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

  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon Key Management Service (Amazon KMS) 控制台:https://console.aws.amazon.com/kms

  2. 要更改 Amazon 区域,请使用页面右上角的 Region selector (区域选择器)。

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

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

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

  6. 选择 Attach

使用 Amazon CLI 创建加密的 AMI

  • 在 Amazon 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。有关更多信息,请参阅 从预配置的实例创建自定义亚马逊 Linux AMI