使用自定义 AMI - Amazon EMR

使用自定义 AMI

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

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

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

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

    注意

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

自定义 AMI 必须与您创建的集群位于同一AWS区域中。它还应该与 EC2 实例架构匹配。例如,m5.xlarge 实例具有 x86_64 架构。因此,要使用自定义 AMI 预置 m5.xlarge,您的自定义 AMI 还应具有 x86_64 架构。同样,要预置具有 arm64 架构的 m6g.xlarge 实例,您的自定义 AMI 应该具有 arm64 架构。有关为实例类型识别 Linux AMI 的更多信息,请参阅《适用于 Linux 实例的 Amazon EC2 用户指南》中的查找 Linux AMI

重要

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

从预置的实例创建自定义 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 m5.xlarge \ --key-name MyKeyName --region us-west-2

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

  2. 运行以下命令:

    aws ec2 describe-instances --instance-ids MyInstanceId

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

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

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

    sudo yum install MySoftwarePackage sudo pip install MySoftwarePackage
从自定义映像创建快照

如何在 Amazon EMR 集群中使用自定义 AMI

您可以通过以下两种方式使用自定义 AMI 来预置 Amazon EMR 集群:

  • 对集群中的所有 EC2 实例,使用单个自定义 AMI。

  • 对集群中使用的不同 EC2 实例类型,使用不同的自定义 AMI。

预置 EMR 集群时,您只能使用两个选项中的一个,而且在集群启动后就无法更改它。

在 Amazon EMR 集群中使用单个和多个自定义 AMI 的注意事项
考虑因素 单个自定义 AMI 多个自定义 AMI

在同一集群中使用 x86 和 Graviton2 处理器和自定义 AMI

不支持

支持

AMI 自定义取决于实例类型

不支持

支持

向正在运行的集群添加新的任务实例组/队列时,更改自定义 AMI。注意:您不能更改现有实例组/队列的自定义 AMI。

不支持

支持

使用 AWS 控制台启动集群

支持

不支持

使用 AWS CloudFormation 启动集群

支持

支持

在 EMR 集群中使用单个自定义 AMI

要在创建集群时指定自定义 AMI ID,请使用以下方法之一:

注意

我们重新设计了 Amazon EMR 控制台,以便其易于使用。请参阅 控制台中的新增功能,以了解有关新旧控制台体验差异的信息。

New console
使用新控制台指定单个自定义 AMI
  1. 登录 AWS Management Console 并打开 Amazon EMR 控制台,网址为 https://console.aws.amazon.com/emr

  2. 在左侧导航窗格中的 EMR on EC2 下,选择 Clusters(集群),然后选择 Create cluster(创建集群)。

  3. Name and applications(名称和应用程序)下,找到 Operating system options(操作系统选项)。选择 Custom AMI(自定义 AMI),然后在 Custom AMI(自定义 AMI)字段中输入 AMI ID。

  4. 选择适用于集群的任何其他选项。

  5. 要启动集群,选择 Create cluster(创建集群)。

Old console
使用旧控制台指定单个自定义 AMI
  1. 导航到 Amazon EMR 新控制台,然后从侧面导航栏中选择切换到旧控制台。有关切换到旧控制台后预期情况的更多信息,请参阅 Using the old console

  2. 依次选择 Create cluster (创建集群)Go to advanced options (转到高级选项)

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

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

  5. 其他选项中,针对自定义 AMI ID,输入一个值并确保重启时更新所有安装的软件包选项已选中。有关更改更新选项的更多信息,请参阅管理 AMI 程序包存储库更新

  6. 要启动集群,请选择 Next (下一步) 并完成其它配置选项。

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

在 Amazon EMR 集群中使用多个自定义 AMI

要使用多个自定义 AMI 创建群集,请使用以下方法之一:

AWS 管理控制台目前不支持使用多个自定义 AMI 创建集群。

例 -使用AWS CLI 通过多个自定义 AMI 创建实例组集群

使用 AWS CLI 版本 1.20.21 或更高版本,您可以将单个自定义 AMI 分配给整个集群,也可以向集群中每个实例节点分配多个自定义 AMI。

以下示例显示了使用跨节点类型(主节点、核心、任务)使用两种实例类型 (m5.xlarge) 创建的统一实例组集群。每个节点都有多个自定义 AMI。该示例说明了多个自定义 AMI 配置的几个功能:

  • 集群级别没有分配自定义 AMI。这是为了避免多个自定义 AMI 和单个自定义 AMI 之间的冲突,这将导致集群启动失败。

  • 集群可以在主节点、核心和单个任务节点之间拥有多个自定义 AMI。这允许单个 AMI 自定义,例如:预安装的应用程序、复杂的集群配置和加密的 Amazon EBS 根设备卷。

  • 实例组核心节点只能有一种实例类型和相应的自定义 AMI。同样,主节点 (master node) 只能有一种实例类型和相应的自定义 AMI。

  • 集群可以有多个任务节点。

aws emr create-cluster --instance-groups InstanceGroupType=MASTER,InstanceType=m5.xlarge,InstanceCount=1,CustomAmiId=ami-123456 InstanceGroupType=CORE,InstanceType=m5.xlarge,InstanceCount=1,CustomAmiId=ami-234567 InstanceGroupType=TASK,InstanceType=m6g.xlarge,InstanceCount=1,CustomAmiId=ami-345678 InstanceGroupType=TASK,InstanceType=m5.xlarge,InstanceCount=1,CustomAmiId=ami-456789
例 – 使用 AWS CLI 版本 1.20.21 或更高版本将任务节点添加到包含多种实例类型和多个自定义 AMI 的正在运行的实例组集群

使用 AWS CLI 版本 1.20.21 或更高版本,您可以将多个自定义 AMI 添加到实例组(您要将该实例组添加到正在运行的集群)。CustomAmiId参数可以与add-instance-groups命令一起使用,如以下示例所示。请注意,在多个节点中使用相同的多个自定义 AMI ID (ami-123456)。

aws emr create-cluster --instance-groups InstanceGroupType=MASTER,InstanceType=m5.xlarge,InstanceCount=1,CustomAmiId=ami-123456 InstanceGroupType=CORE,InstanceType=m5.xlarge,InstanceCount=1,CustomAmiId=ami-123456 InstanceGroupType=TASK,InstanceType=m5.xlarge,InstanceCount=1,CustomAmiId=ami-234567 { "ClusterId": "j-123456", ... } aws emr add-instance-groups --cluster-id j-123456 --instance-groups InstanceGroupType=Task,InstanceType=m6g.xlarge,InstanceCount=1,CustomAmiId=ami-345678
例 – 使用 AWS CLI 版本 1.20.21 或更高版本创建实例集集群、多个自定义 AMI、多种实例类型、按需主节点、按需核心、多个核心和任务节点
aws emr create-cluster --instance-fleets InstanceFleetType=MASTER,TargetOnDemandCapacity=1,InstanceTypeConfigs=['{InstanceType=m5.xlarge, CustomAmiId=ami-123456}'] InstanceFleetType=CORE,TargetOnDemandCapacity=1,InstanceTypeConfigs=['{InstanceType=m5.xlarge,CustomAmiId=ami-234567},{InstanceType=m6g.xlarge, CustomAmiId=ami-345678}'] InstanceFleetType=TASK,TargetSpotCapacity=1,InstanceTypeConfigs=['{InstanceType=m5.xlarge,CustomAmiId=ami-456789},{InstanceType=m6g.xlarge, CustomAmiId=ami-567890}']
例 – 使用 AWS CLI 版本 1.20.21 或更高版本将任务节点添加到包含多种实例类型和多个自定义 AMI 的正在运行的集群
aws emr create-cluster --instance-fleets InstanceFleetType=MASTER,TargetOnDemandCapacity=1,InstanceTypeConfigs=['{InstanceType=m5.xlarge, CustomAmiId=ami-123456}'] InstanceFleetType=CORE,TargetOnDemandCapacity=1,InstanceTypeConfigs=['{InstanceType=m5.xlarge,CustomAmiId=ami-234567},{InstanceType=m6g.xlarge, CustomAmiId=ami-345678}'] { "ClusterId": "j-123456", ... } aws emr add-instance-fleet --cluster-id j-123456 --instance-fleet InstanceFleetType=TASK,TargetSpotCapacity=1,InstanceTypeConfigs=['{InstanceType=m5.xlarge,CustomAmiId=ami-234567},{InstanceType=m6g.xlarge, CustomAmiId=ami-345678}']

管理 AMI 程序包存储库更新

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

警告

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

使用 AWS Management Console,您可以在选择 Custom AMI(自定义 AMI ID)时选择用于禁用更新的选项。

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

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

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

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

注意

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

您可以使用外部密钥提供程序或 AWS KMS 密钥来加密 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": [ "*" ] } ] }

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

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

使用控制台将 Amazon EC2 的服务角色添加到加密密钥用户列表
  1. 登录到 AWS Management Console,然后通过以下网址打开 AWS Key Management Service (AWS KMS) 控制台:https://console.aws.amazon.com/kms

  2. 要更改 AWS 区域,请使用页面右上角的区域选择器。

  3. 选择要使用的 KMS 密钥的别名。

  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)。有关更多信息,请参阅在 EMR 集群中使用单个自定义 AMI。您也可选择通过安装软件并执行其它配置来自定义此 AMI。有关更多信息,请参阅从预置的实例创建自定义 Amazon Linux AMI

最佳实践和注意事项

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

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

  • 对于 5.30.0 和 6.x 之前的 Amazon EMR 版本,不支持 Amazon Linux 2 AMI。

  • 您必须使用 64 位 Amazon Linux AMI。不支持 32 位 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(创建日期为 2018-08-11)的自定义 Amazon Linux AMI,则 Oozie 服务器无法启动。如果您使用 Oozie,请根据具有不同创建日期的 Amazon Linux AMI ID 创建自定义 AMI。您可以使用以下 AWS CLI 命令返回所有 2018.03 版本的 HVM Amazon Linux AMI 的镜像 ID 列表以及发布日期,以便您可以根据需要选择合适的 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
  • 如果您使用的 VPC 采用非标准域名和 AmazonProvidedDNS,则不应使用操作系统 DNS 配置中的 rotate 选项。

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