本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用自定义AMI为 Amazon EMR 集群配置提供更大的灵活性
当你使用亚马逊 EMR 5.7.0 或更高版本时,你可以选择指定自定义的亚马逊 Linux,AMI而不是亚马逊的默认亚马逊 Linux AMI。EMR如果您想执行以下操作,AMI则自定义非常有用:
-
预安装应用程序并执行其它自定义设置,而不使用引导操作。这可缩短集群启动时间并简化启动工作流程。有关更多信息以及示例,请参阅 AMI从预配置的实例创建自定义 Amazon Linux。
-
实施比引导操作允许的集群和节点配置更高级的集群和节点配置。
-
如果您使用的是低于 5.24.0 的 Amazon EMR 版本,请加密集群中EC2实例的EBS根设备卷(启动卷)。与默认设置一样AMI,对于亚马逊 6.9 及更低版本,自定义的最小根卷大小AMI为 10 GiB,亚马逊 6.10 及更高EMR版本的最小根卷大小为 15 GiB。EMR有关更多信息,请参阅 AMI使用加密的 Amazon EBS 根设备卷创建自定义卷。
注意
从 Amazon 5.24.0 EMR 版本开始,当您指定 AWS KMS 为密钥提供商时,您可以使用安全配置选项来加密EBS根设备和存储卷。有关更多信息,请参阅 本地磁盘加密。
自定义AMI必须存在于您创建集群的同一 AWS 区域。它还应与EC2实例架构相匹配。例如,m5.xlarge 实例具有 x86_64 架构。因此,要使用自定义配置 m5.xlargeAMI,您的自定义还AMI应具有 x86_64 架构。同样,要配置具有 arm64 架构的 m6g.xlarge 实例,您的自定义AMI实例应具有 arm64 架构。有关为您的实例类型识别 Linux AMI 的更多信息,请参阅亚马逊EC2用户指南AMI中的查找 Linux。
重要
EMR运行 Amazon Linux 或 Amazon Linux 2 Amazon 机器映像 (AMIs) 的集群使用默认 Amazon Linux 行为,不会自动下载和安装需要重启的重要关键内核更新。这与运行默认 Amazon Linux 的其他亚马逊EC2实例的行为相同AMI。如果在 Amazon EMR 版本发布后需要重启的新 Amazon Linux 软件CUDA更新(例如内核和更新)可用,则默认运行的EMR集群实例AMI不会自动下载和安装这些更新。NVIDIA要获取内核更新,您可以自定义您的亚马逊EMRAMI以使用最新的亚马逊 Linux AMI。
AMI从预配置的实例创建自定义 Amazon Linux
预安装软件和执行其他配置以创建适用于亚马逊的自定义 Amazon Linux AMI 的基本步骤EMR如下:
-
从基础亚马逊 Linux 启动实例AMI。
-
连接到实例以安装软件和执行其它自定义操作。
-
为您配置的实例创建新映像(AMI快照)。
在基于自定义实例创建映像之后,您可将此映像复制到已加密的目标,如AMI使用加密的 Amazon EBS 根设备卷创建自定义卷中所述。
教程:AMI从安装了自定义软件的实例创建
启动基于最新亚马逊 Linux 的EC2实例 AMI
-
AWS CLI 使用运行以下命令,该命令使用现有实例创建实例AMI。
替换为您用于连接实例的密钥对以及MyKeyName
MyAmiId
相应的 Amazon Linux 的 ID AMI。有关最新消息 AMIIDs,请参阅亚马逊 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连接。有关更多信息,请参阅亚马逊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中使用单个自定义和AMI使用加密的 Amazon EBS 根设备卷创建自定义卷。
如何在 Amazon EMR 集群AMI中使用自定义
您可以通过两种方式使用自定义AMI来配置 Amazon EMR 集群:
-
对集群中的AMI所有EC2实例使用单个自定义实例。
-
AMIs对集群中使用的不同EC2实例类型使用不同的自定义。
在配置集群时,您只能使用两个选项中的一个,并且在EMR集群启动后就无法对其进行更改。
考虑因素 | 单件定制 AMI | 多重定制 AMIs |
---|---|---|
在同一个集群中同时使用自定义AMIs的 x86 和 Graviton2 处理器 |
不支持 |
支持 |
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 SDK
-
Amazon EMR API RunJobFlow
-
AWS CloudFormation (参见 “群集”、“群集” InstanceGroupConfig、“资源 InstanceGroupConfig” 或 “资源-” 中的
CustomAmiID
属性 InstanceFleetConfig-InstanceTypeConfig) InstanceTypeConfig
在 Amazon EMR 集群AMIs中使用多个自定义
要使用多个自定义创建集群AMIs,请使用以下方法之一:
-
AWS CLI版本 1.20.21 或更高版本
-
AWS SDK
-
亚马逊EMRAPI参考EMRRunJobFlow中的亚马逊
-
AWS CloudFormation (参见 “群集”、“群集” InstanceGroupConfig、“资源 InstanceGroupConfig” 或 “资源-” 中的
CustomAmiID
属性 InstanceFleetConfig-InstanceTypeConfig) InstanceTypeConfig
AWS 管理控制台目前不支持使用多个自定义创建集群AMIs。
例 -使用使用多个自定义创建实例组集群 AWS CLI AMIs
使用 1.20.21 或更高 AWS CLI版本,您可以为整个集群分配一个自定义AMI节点,也可以为集群中的每个实例节点分配多个自定义AMIs节点。
以下示例显示了使用跨节点类型(主节点、核心、任务)使用两种实例类型(m5.xlarge)创建的统一实例组集群。每个节点都有多个自定义AMIs。该示例说明了多重自定义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
使用 1.20.21 或更高 AWS CLI版本,您可以将多个自定义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 指定自定义AMI更新时,您可以选择禁用这些更新EMR。仅当您使用自定义功能时,禁用此功能的选项才可用AMI。默认情况下,Amazon Linux 内核更新以及其它需要重新启动的软件包不会更新。请注意,您的联网配置必须允许HTTP并导HTTPS出到 Amazon S3 中的 Amazon Linux 存储库,否则安全更新将无法成功。
警告
我们强烈建议您在指定自定义软件包时选择在重启时更新所有已安装的软件包AMI。选择不更新程序包将产生额外的安全风险。
使用 AWS Management Console,您可以在选择 “自定义” 时选择禁用更新的选项AMI。
使用 AWS CLI,您可以--repo-upgrade-on-boot NONE
同时指定--custom-ami-id
何时使用create-cluster命令。
使用 Amazon EMRAPI,您可以NONE
为RepoUpgradeOnBoot参数指定。
AMI使用加密的 Amazon EBS 根设备卷创建自定义卷
要对亚马逊版 Amazon Linux 的亚马逊EBS根设备卷AMI进行加密EMR,请将快照映像从未加密的目标复制AMI到加密的目标。有关创建加密EBS卷的信息,请参阅亚马逊EC2用户指南中的亚马逊EBS加密。快照AMI的来源可以是基本 Amazon LinuxAMI,也可以复制从您自定义的基本 Amazon Linux AMI 派生AMI的快照。
注意
从 Amazon 5.24.0 EMR 版本开始,当您指定 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有关创建密钥的更多信息,请参阅《AWS Key Management Service 开发人员指南》中的创建密钥。以下过程说明如何将默认服务角色 EMR_DefaultRole
作为密钥用户添加到密钥策略。在创建或编辑密钥时记下密钥的ARN值。当你创建时,你使用ARN更高的值AMI。
使用控制台将 Amazon EC2 的服务角色添加到加密密钥用户列表中
-
登录 AWS Management Console 并在 https://console.aws.amazon.com/km
s 处打开 AWS Key Management Service (AWS KMS) 控制台。 -
要更改 AWS 区域,请使用页面右上角的区域选择器。
-
选择要使用的KMS密钥的别名。
-
在密钥详细信息页面的 Key Users (密钥用户) 下,选择 Add (添加)。
-
在 “附加” 对话框中,选择 Amazon EMR 服务角色。默认角色的名称为
EMR_DefaultRole
。 -
选择 Attach (附加)。
要创建AMI使用加密的 AWS CLI
-
使用中的
aws ec2 copy-image
AWS CLI 命令创建AMI带有加密EBS根设备卷和您修改的密钥的。将指定的--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
该命令的输出提供了您创建的 IDAMI,您可以在创建集群时指定该ID。有关更多信息,请参阅 在EMR集群AMI中使用单个自定义。您也可以选择AMI通过安装软件和执行其他配置来对其进行自定义。有关更多信息,请参阅 AMI从预配置的实例创建自定义 Amazon Linux。
最佳实践和注意事项
在为 Amazon 创建自定义AMI内容时EMR,请考虑以下几点:
-
亚马逊 EMR 7.x 系列基于亚马逊 Linux 2023。对于这些亚马逊EMR版本,您需要使用基于亚马逊 Linux 2023 的图片进行自定义AMIs。要查找基本自定义AMI,请参阅查找 Linux AMI。
-
对于低于 7.x 的亚马逊EMR版本,不支持亚马逊 Linux 2023 AMIs。
-
亚马逊 EMR 5.30.0 及更高版本以及亚马逊 EMR 6.x 系列基于亚马逊 Linux 2。对于这些亚马逊EMR版本,您需要使用基于亚马逊 Linux 2 的图像进行自定义AMIs。要查找基本自定义AMI,请参阅查找 Linux AMI。
-
对于低于 5.30.0 和 6.x 的亚马逊EMR版本,不支持亚马逊 Linux AMIs 2。
-
你必须使用 64 位的亚马逊 Linux AMI。不支持 32 位AMI。
-
不支持AMIs带有多个亚马逊EBS卷的亚马逊 Linux。
-
以最新EBS支持的亚马逊 Linux AMI
为基础进行自定义。有关亚马逊 Linux AMIs 及相应产品的列表 AMIIDs,请参阅亚马逊 Linux AMI 。 -
请勿复制现有 Amazon EMR 实例的快照来创建自定义实例AMI。这将导致错误。
-
仅支持与 Amazon EMR 兼容的HVM虚拟化类型和实例。在完成AMI自定义过程时,请务必选择EMR与 Amazon 兼容的HVM图像和实例类型。有关兼容的实例和虚拟化类型,请参阅Amazon 支持的实例类型 EMR。
-
您的服务角色必须对具有启动权限AMI,因此AMI必须是公开的,或者您必须是的所有者AMI或由所有者与您共享。
-
在上创建AMI与应用程序同名的用户会导致错误(例如
hadoop
、hdfs
yarn
、或spark
)。 -
/tmp
/var
、和/emr
(如果存在于上AMI)的内容将在启动期间/mnt/emr
分别移至/mnt/tmp
/mnt/var
、和。文件将保留,但如果有大量数据,则启动时间可能长于预期时间。 如果你使用AMI基于亚马逊 Linux 的自定义 Amazon LinuxAMI,创建日期为 2018-08-11,Oozie 服务器将无法启动。如果你使用 Ooozie,请AMI根据创建日期不同的亚马逊 Linux AMI ID 创建自定义账号。您可以使用以下 AWS CLI 命令返回所有 HVM Amazon Linux AMIs 版本为 2018.03 的图片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带有非标准域名的和 AmazonProvidedDNS,则不应在操作系统DNS配置中使用该
rotate
选项。 -
如果您创建的自定义AMI包含 Amazon S EC2 ystems Manager (SSM) 代理,则启用的SSM代理可能会导致集群上出现配置错误。为避免这种情况,请在使用自定义SSM代理时禁用该代理AMI。为此,当您选择并启动您的 Amazon EC2 实例时,请先禁用SSM代理,然后再使用该实例创建自定义集群,AMI然后再创建您的EMR集群。
有关更多信息,请参阅亚马逊EC2用户指南AMI中的创建由亚马逊EBS支持的 Linux。