本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用自定义 AMI 为 Amazon EMR 集群配置提供更大的灵活性
使用 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 一样,Amazon EMR 版本 6.9 及较低版本的自定义 AMI 的最小根卷大小为 10GiB,Amazon EMR 版本 6.10 及更高版本的最小根卷大小为 15GiB。有关更多信息,请参阅 创建带加密 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 的更多信息,请参阅《Amazon EC2 用户指南》中的查找 Linux AMI。
重要
运行 Amazon Linux 或 Amazon Linux 2 亚马逊机器映像(AMIs)的 EMR 集群使用默认的 Amazon Linux 行为,且不会自动下载和安装需要重新启动的重要关键内核更新。这与运行默认 Amazon Linux AMI 的其它 Amazon Linux AMI EC2 实例的行为相同。如果需要重新启动的新 Amazon Linux 软件更新(例如内核、NVIDIA 和 CUDA 更新)在 Amazon EMR 版本发布后可用,则运行默认 AMI 的 EMR 集群实例不会自动下载和安装这些更新。要获取内核更新,您可以自定义 Amazon EMR AMI,以使用最新的 Amazon Linux AMI。
从预置的实例创建自定义 Amazon Linux AMI
预安装软件并执行其它配置以便为 Amazon EMR 创建自定义 Amazon Linux AMI 的基本步骤如下所示:
-
从基础 Amazon Linux AMI 启动实例。
-
连接到实例以安装软件和执行其它自定义操作。
-
创建已配置实例的新映像(AMI 快照)。
在基于自定义实例创建映像之后,您可将此映像复制到已加密的目标,如创建带加密 Amazon EBS 根设备卷的自定义 AMI中所述。
教程:从带有已安装自定义软件的实例创建 AMI
启动基于最新亚马逊 Linux AMI 的 EC2 实例
-
使用运行以下命令,该命令使用现有 AMI 创建实例。 AWS CLI
替换为您用于连接实例的密钥对和MyKeyName
MyAmiId
相应的 Amazon Linux AMI 的 ID。有关最新的 AMI IDs,请参阅亚马逊 Linux AMI。 注意
为了便于读取,包含 Linux 行继续符(\)。它们可以通过 Linux 命令删除或使用。对于 Windows,请将它们删除或替换为脱字号(^)。
aws ec2 run-instances --image-id
MyAmiID
\ --count 1 --instance-typem5.xlarge
\ --key-nameMyKeyName
--regionus-west-2
InstanceId
输出值在下一步中用作
。MyInstanceId
-
运行以下命令:
aws ec2 describe-instances --instance-ids
MyInstanceId
PublicDnsName
输出值在下一步中用于连接到实例。
连接到实例并安装软件
-
使用可让您在 Linux 实例上运行 shell 命令的 SSH 连接。有关更多信息,请参阅 Amazon EC2 用户指南中的使用 SSH 连接您的 Linux 实例。
-
执行任何所需的自定义操作。例如:
sudo yum install
MySoftwarePackage
sudo pip installMySoftwarePackage
从自定义映像创建快照
-
在自定义实例之后,使用
create-image
命令从实例创建 AMI。aws ec2 create-image --no-dry-run --instance-id
MyInstanceId
--nameMyEmrCustomAmi
在您启动集群或创建加密快照时,将使用
imageID
输出值。有关更多信息,请参阅在 EMR 集群中使用单个自定义 AMI和创建带加密 Amazon EBS 根设备卷的自定义 AMI。
如何在 Amazon EMR 集群中使用自定义 AMI
您可以通过以下两种方式使用自定义 AMI 来预置 Amazon EMR 集群:
-
对集群中的所有 EC2 实例,使用单个自定义 AMI。
-
AMIs 对集群中使用的不同 EC2 实例类型,使用不同的自定义。
预置 EMR 集群时,您只能使用两个选项中的一个,而且在集群启动后就无法更改它。
考虑因素 | 单个自定义 AMI | 多重定制 AMIs |
---|---|---|
在同一集群中使用 x86 和 Graviton2 处理器和自定义 AMIs |
不支持 |
支持 |
AMI 自定义取决于实例类型 |
不支持 |
支持 |
添加新任务实例 AMIs 时更改自定义groups/fleets to a running cluster. Note: you cannot change the custom AMI of existing instance groups/fleets。 |
不支持 |
支持 |
使用 AWS 控制台启动集群 |
支持 |
不支持 |
AWS CloudFormation 用于启动集群 |
支持 |
支持 |
在 EMR 集群中使用单个自定义 AMI
要在创建集群时指定自定义 AMI ID,请使用以下方法之一:
-
AWS Management Console
-
AWS CLI
-
Amazon EMR 开发工具包
-
亚马逊 EMR API RunJobFlow
-
AWS CloudFormation (参见 “群集”、“群集” InstanceGroupConfig、“资源 InstanceGroupConfig” 或 “资源-” 中的
CustomAmiID
属性 InstanceFleetConfig-InstanceTypeConfig) InstanceTypeConfig
在 Amazon EM AMIs R 集群中使用多个自定义设置
要使用多个自定义集群 AMIs,请使用以下方法之一:
-
AWS CLI 版本 1.20.21 或更高版本
-
AWS SDK
-
亚马逊 EMR API RunJobFlow参考中的亚马逊 EMR
-
AWS CloudFormation (参见 “群集”、“群集” InstanceGroupConfig、“资源 InstanceGroupConfig” 或 “资源-” 中的
CustomAmiID
属性 InstanceFleetConfig-InstanceTypeConfig) InstanceTypeConfig
AWS 管理控制台目前不支持使用多个自定义创建集群 AMIs。
例 -使用 C AWS LI 通过多个自定义创建实例组集群 AMIs
使用 AWS CLI 版本 1.20.21 或更高版本,您可以将单个自定义 AMI 分配给整个集群,也可以 AMIs 向集群中每个实例节点分配多个自定义。
以下示例显示了使用跨节点类型(主节点、核心、任务)使用两种实例类型(m5.xlarge)创建的统一实例组集群。每个节点都有多个自定义 AMIs。该示例说明了多个自定义 AMI 配置的几个功能:
-
集群级别没有分配自定义 AMI。这是为了避免多个自定义 AMI AMIs 和单个自定义 AMI 之间的冲突,这将导致集群启动失败。
-
集群可以在主节点、核心和单个任务节点之间拥有 AMIs 多个自定义节点。这允许单个 AMI 自定义,例如:预安装的应用程序、复杂的集群配置和加密的 Amazon EBS 根设备卷。
-
实例组核心节点只能有一种实例类型和相应的自定义 AMI。同样,主节点只能有一种实例类型和相应的自定义 AMI。
-
集群可以有多个任务节点。
aws emr create-cluster --instance-groups InstanceGroupType=PRIMARY,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 或更高版本将任务节点添加到包含多种实例类型和多个自定义实例类型的正在运行的实例组集群 AMIs
使用 AWS CLI 版本 1.20.21 或更高版本,您可以将多个自定义实例组添加到实例组(您 AMIs 要将该实例组添加到正在运行的集群)。CustomAmiId
参数可以与add-instance-groups
命令一起使用,如以下示例所示。请注意,在多个节点中使用相同的多个自定义 AMI ID (ami-123456)。
aws emr create-cluster --instance-groups InstanceGroupType=PRIMARY,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 或更高版本创建实例机群群、多个自定义、多种实例类型 AMIs、按需主节点、按需核心、多个核心和任务节点
aws emr create-cluster --instance-fleets InstanceFleetType=PRIMARY,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 或更高版本将任务节点添加到包含多种实例类型和多个自定义实例的正在运行的集群 AMIs
aws emr create-cluster --instance-fleets InstanceFleetType=PRIMARY,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 将在其它服务启动之前 AMIs 连接到程序包存储库以安装安全更新。根据您的环境,在为 Amazon EMR 指定自定义 AMI 时,可以选择禁用这些更新。用于禁用此功能的选项仅在您使用自定义 AMI 时可用。默认情况下,Amazon Linux 内核更新以及其它需要重新启动的软件包不会更新。请注意,您的联网配置必须允许 HTTP 和 HTTPS 传出到 Amazon S3 中的 Amazon Linux 存储库,否则安全更新将失败。
警告
我们强烈建议您在指定自定义 AMI 时选择重新启动以更新所有安装的程序包。选择不更新程序包将产生额外的安全风险。
使用 AWS Management Console,您可以在选择 Custom AMI(自定义 AMI)时选择用于禁用更新的选项。
使用 AWS CLI,您可以--repo-upgrade-on-boot NONE
同时指定--custom-ami-id
何时使用create-cluster命令。
使用 Amazon EMR API,您可以NONE
为参数指定。RepoUpgradeOnBoot
创建带加密 Amazon EBS 根设备卷的自定义 AMI
要为 Amazon EMR 加密 Amazon Linux AMI 的 Amazon EBS 根设备卷,请将未加密的 AMI 中的快照镜像复制到已加密的目标。有关创建加密 EBS 卷的信息,请参阅《亚马逊 EC2 用户指南》中的 Ama zon EBS 加密。快照的源 AMI 可以是基础 Amazon Linux AMI,您也可从派生自您自定义的基础 Amazon Linux AMI 的 AMI 复制快照。
注意
从 Amazon EMR 版本 5.24.0 开始,您指定 AWS KMS 作为密钥提供程序时,可以使用安全配置选项加密 EBS 根设备和存储卷。有关更多信息,请参阅 本地磁盘加密。
您可以使用外部密钥提供程序或 KMK 密 AWS 钥来加密 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 的服务角色添加到加密密钥用户列表
-
登录 AWS Management Console 并在 https://console.aws.amazon.com/km
s 处打开 AWS Key Management Service (AWS KMS) 控制台。 -
要更改 AWS 区域,请使用页面右上角的 Region selector(区域选择器)。
-
选择要使用的 KMS 密钥的别名。
-
在密钥详细信息页面的 Key Users (密钥用户) 下,选择 Add (添加)。
-
在 Attach (附加) 对话框中,选择 Amazon EMR 服务角色。默认角色的名称为
EMR_DefaultRole
。 -
选择 Attach (附加)。
使用创建加密的 AMI AWS CLI
-
使用中的
aws ec2 copy-image
命令创建带有加密的 EBS 根设备卷和您修改的密钥的 AMI。 AWS CLI 将指定的--kms-key-id
值替换为您在早期版本创建或修改的密钥的完整 ARN。注意
为了便于读取,包含 Linux 行继续符(\)。它们可以通过 Linux 命令删除或使用。对于 Windows,请将它们删除或替换为脱字号(^)。
aws ec2 copy-image --source-image-id
MyAmiId
\ --source-regionus-west-2
--nameMyEncryptedEMRAmi
\ --encrypted --kms-key-idarn: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 7.x 系列基于 Amazon Linux 2023。对于这些 Amazon EMR 版本,您需要使用基于 Amazon Linux 2023 的映像进行自定义。 AMIs要查找基本自定义 AMI,请参阅查找 Linux AMI。
-
低于 7.x 的 Amazon EMR 版本不支持 Amazon Linux 2023 AMIs 。
-
Amazon EMR 5.30.0 及更高版本,以及 Amazon EMR 6.x 系列都基于 Amazon Linux 2。对于这些 Amazon EMR 版本,您需要对自定义 Amazon Linux 2 的映像。 AMIs要查找基本自定义 AMI,请参阅查找 Linux AMI。
-
对于 5.30.0 和 6.x 之前的 Amazon EMR 版本,不支持 Amazon Linux 2。 AMIs
-
您必须使用 64 位 Amazon Linux AMI。不支持 32 位 AMI。
-
不支持 AMIs 具有多个 Amazon EBS 卷的 Amazon Linux。
-
使您的自定义项基于由 EBS 支持的最新 Amazon Linux AMI
。有关亚马逊 Linux AMIs 和相应的 AMI 的列表 IDs,请参阅亚马逊 Linux AMI 。 -
请不要复制现有 Amazon EMR 实例的快照来创建自定义 AMI。这将导致错误。
-
仅支持 HVM 虚拟化类型和与 Amazon EMR 兼容的实例。在您执行 AMI 自定义过程时,务必选择 HVM 镜像和与 Amazon EMR 兼容的实例类型。有关兼容的实例和虚拟化类型,请参阅Amazon EMR 支持的实例类型。
-
您的服务角色在 AMI 上必须具有启动许可,因此 AMI 必须为公用 AMI,或者您必须是 AMI 的所有者或所有者已与您共享 AMI。
-
在 AMI 上创建与应用程序同名的用户将导致错误 (例如,
hadoop
、hdfs
、yarn
或spark
)。 -
/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 AMIs 镜像 IDs 列表以及发布日期,以便您可以根据需要选择合适的 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 采用非标准域名和 AmazonProvided DNS,则不应使用操作系统 DNS 配置中的
rotate
选项。 -
如果您创建包含 Amazon S EC2 ystems Manager (SSM) 代理的自定义 AMI,则启用的 SSM 代理可能会导致集群上出现配置错误。为避免这种情况,请在使用自定义 AMI 时禁用 SSM 代理。为此,当您选择并启动您的 Amazon EC2 实例时,请在使用该实例创建自定义 AMI 并随后创建 EMR 集群之前禁用 SSM 代理。
有关更多信息,请参阅亚马逊 EC2 用户指南中的创建由亚马逊 EBS 支持的 Linux AMI。