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

使用自定义 AMI

在您创建和启动集群时,Amazon EMR 使用 Amazon Linux Amazon 系统映像 (AMI) 初始化 Amazon EC2 实例。AMI 包含 Amazon Linux 操作系统、其他软件和每个用于托管集群应用程序的实例所需的配置。默认情况下,当您创建集群时,无需考虑 AMI。当集群中的 EC2 实例启动时,Amazon EMR 将与 Amazon EMR 拥有的默认 Amazon Linux AMI 一起启动,运行您指定的任何引导操作,然后安装并配置您选择的应用程序和组件。您还可以自定义默认 AMI 的 Amazon EBS 根设备卷大小。有关更多信息,请参阅 指定 Amazon EBS 根设备卷大小

或者,如果您使用 Amazon EMR 5.7.0 版或更高版本,则可在创建集群时指定自定义 Amazon Linux AMI 并自定义其根卷大小。当每个 EC2 实例启动时,它将与您的自定义 AMI 而不是 EMR 拥有的 AMI 一起启动。

指定自定义 AMI 对下列使用案例非常有用:

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

    注意

    仅在您需要加密实例的 EBS 根设备卷时需要自定义 AMI。您还可使用 Amazon EMR 安全配置启用静态加密来加密 EBS 存储卷。有关更多信息,请参阅 Amazon EMR 版本指南 中的本地磁盘静态加密

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

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

有关更多信息,请参阅 Amazon 系统映像 (AMI)。有关使用引导操作的详细信息,请参见 创建引导操作以安装其他软件

最佳实践和注意事项

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

  • 您必须使用 Amazon Linux 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 EC2 User Guide for Linux Instances 中的创建 Amazon EBS 支持的 Linux AMI

指定自定义 AMI

可以在使用 AWS Management Console、AWS CLI 或 Amazon EMR API 创建集群时指定自定义 AMI ID。AMI 必须存在于您创建集群的同一个区域中。

使用控制台指定自定义 AMI

  1. Open the Amazon EMR console at 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 程序包存储库更新

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

使用 AWS CLI 指定自定义 AMI

  • 在运行 aws emr create-cluster 命令时,使用 --custom-ami-id 参数可指定 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 Management Console,您可在选择 Custom 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 User Guide for Linux Instances 中的使用 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 User Guide for Linux Instances 中的 Amazon EBS encryption。快照的源 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. Sign in to the AWS Management Console and open the AWS Key Management Service (AWS KMS) console at 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

指定 Amazon EBS 根设备卷大小

无论您使用默认 AMI 还是自定义 AMI,都可指定 EBS 根设备卷的大小 (GiB)。此选项仅适用于 Amazon EMR 4.x 版及更高版本。当您使用 AWS Management Console、AWS CLI 或 Amazon EMR API 创建集群时,可指定从 10 GiB (默认值) 到 100 GiB (最大值) 的卷大小。此大小调整仅适用于 EBS 根设备卷,并且适用于集群中的所有实例。它不适用于您在创建集群时为每个实例类型单独指定的存储卷。

注意

如果您使用默认 AMI,Amazon EMR 将挂载通用型 SSD (gp2) 作为根设备卷类型。自定义 AMI 可能具有其他根设备卷类型。有关更多信息,请参阅 指定自定义 AMI

基于从中运行集群的区域中的卷类型的每月 EBS 费用按小时比例收取 EBS 根设备卷成本。存储卷也是如此。费用按 GB 计算,但如果您以 GiB 为单位指定根卷大小,可能需要在估算值中考虑到这一点 (1 GB 等于 0.931323 GiB)。要估算与集群中的 EBS 根设备卷关联的费用,请使用以下公式:

($EBS GB­month)×0.931323÷30÷24×EMR_EBSRootGiB×InstanceCount

例如,采用一个具有一个主节点和一个核心节点并使用带默认 10 GiB 根设备卷的基础 Amazon Linux AMI 的集群。如果区域中的 EBS 成本为每月每 GB 0.10 美元,则每实例每小时约 0.00129 美元,集群每小时约 0.00258 美元 (每月每 GB 0.10 美元除以 30 天,除以 24 小时,乘以 10 GB,乘以 2 个集群实例)。

使用控制台指定 EBS 根设备卷大小

  1. Open the Amazon EMR console at https://console.amazonaws.cn/elasticmapreduce/.

  2. 选择 Create cluster

  3. 选择 Go to advanced options

  4. Software Configuration 下,对于 Release,选择 4.x 或 5.x 值和适合您的应用程序的其他选项,然后选择 Next

  5. Hardware Configuration 下,对于 Root device EBS volume size,输入一个介于 10 GiB 和 100 GiB 之间的值。

使用 AWS CLI 指定 EBS 根设备卷大小

  • 使用 create-cluster 命令的 --ebs-root-volume-size 参数,如以下示例所示。

    注意

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

    aws emr create-cluster --release-label emr-5.7.0 \ --ebs-root-volume-size 20 --instance-groups InstanceGroupType=MASTER,\ InstanceCount=1,InstanceType=m4.large InstanceGroupType=CORE,InstanceCount=2,InstanceType=m4.large