创建引导操作以使用 Amazon EMR 集群安装其他软件 - Amazon EMR

创建引导操作以使用 Amazon EMR 集群安装其他软件

您可以使用引导操作安装其它软件或自定义集群实例的配置。引导操作是在 Amazon EMR 使用 Amazon Linux Amazon Machine Image(AMI)启动实例之后在集群上运行的脚本。引导操作在 Amazon EMR 安装您在创建集群时指定的应用程序之前和在集群节点开始处理数据之前运行。如果您向正在运行的集群添加节点,则引导操作也会以相同方式在这些节点上运行。您可以创建自定义引导操作并指定何时创建集群。

Amazon EMR 版本 4.x 不支持适用于 Amazon EMR AMI 版本 2.x 和 3.x 的大多数预定义引导操作。例如,Amazon EMR 版本 4.x 不支持 configure-Hadoopconfigure-daemons。相反,Amazon EMR 版本 4.x 自身就提供了此功能。有关如何将引导操作从 Amazon EMR AMI 版本 2.x 和 3.x 迁移到 Amazon EMR 发行版 4.x 的更多信息,请访问《Amazon EMR 发行之南》中的使用 Amazon EMR 的早期 AMI 版本自定义集群和应用程序配置

引导操作基础

默认以 Hadoop 用户的身份执行引导操作。您可以使用 sudo 以根特权执行引导操作。

所有 Amazon EMR 管理界面都支持引导操作。您可以通过从控制台、AWS CLI 或 API 中提供多个 bootstrap-actions 参数的方式,为每个集群指定最多 16 个引导操作。

在 Amazon EMR 控制台,您可以选择在创建集群时指定引导操作。

如果使用 CLI,通过在使用 create-cluster 命令创建集群时添加 --bootstrap-actions 参数,可将对引导操作脚本的引用传递给 Amazon EMR。

--bootstrap-actions Path="s3://amzn-s3-demo-bucket/filename",Args=[arg1,arg2]

如果引导操作返回非零错误代码,Amazon EMR 会将其当作故障处理,并终止实例。如果太多实例导致引导操作失败,Amazon EMR 就会终止集群。如果只有几个实例失败,Amazon EMR 会尝试重新分配失败的实例并继续执行。使用集群 lastStateChangeReason 错误代码标识引导操作所导致的故障。

带条件运行引导操作

如需仅在主节点上运行引导操作,您可以使用带有某种逻辑的自定义引导操作来确定该节点是否为主节点。

#!/bin/bash if grep isMaster /mnt/var/lib/info/instance.json | grep false; then echo "This is not master node, do nothing,exiting" exit 0 fi echo "This is master, continuing to execute script" # continue with code logic for master node below

以下输出将来自核心节点。

This is not master node, do nothing, exiting

以下输出将来自主节点。

This is master, continuing to execute script

要使用此逻辑,请将您的引导操作(包括上述代码)上载到 Amazon S3 存储桶。在 AWS CLI 上,将 --bootstrap-actions 参数添加到 aws emr create-cluster API 调用并将引导脚本位置指定为 Path

关闭操作

引导操作脚本可以通过向 /mnt/var/lib/instance-controller/public/shutdown-actions/ 目录编写的方式,创建一个或多个关闭操作。当集群终止时,此目录上的所有脚本会并行执行。每个脚本必须在 60 秒钟内运行和完成。

如果节点因为错误而终止,则不保证关闭操作脚本的运行。

注意

使用 Amazon EMR 版本 4.0 及更高版本时,必须在主节点上手动创建 /mnt/var/lib/instance-controller/public/shutdown-actions/ 目录。默认情况下,该目录不存在;但一经创建,该目录中的脚本可在关机前运行。有关连接主节点以创建目录的更多信息,请参阅使用 SSH 连接到 Amazon EMR 集群主节点

使用自定义引导操作

您可以创建自定义脚本以执行自定义引导操作。任何 Amazon EMR 界面都可以引用自定义引导操作。

注意

为了获得最佳性能,我们建议您将要与 Amazon EMR 配合使用的自定义引导操作、脚本和其他文件存储在 Amazon S3 存储桶中,该存储桶与您的集群位于相同的 AWS 区域 中。

添加自定义引导操作

Console
使用控制台通过引导操作创建集群
  1. 登录 AWS Management Console 并打开 Amazon EMR 控制台,网址为 https://console.aws.amazon.com/emr

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

  3. Bootstrap actions(引导操作)下,选择 Add(添加),为操作指定名称、脚本位置和可选参数。选择 Add bootstrap action(添加引导操作)。

  4. (可选)添加更多引导操作。

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

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

CLI
使用 AWS CLI 通过自定义引导操作创建集群

使用 AWS CLI 包含引导操作时,请将 PathArgs 指定为逗号分隔列表。以下示例未使用参数列表。

  • 要通过自定义引导操作启动集群,请键入以下命令,并使用您的 EC2 密钥对的名称替换 myKey。包含 --bootstrap-actions 参数并将引导脚本位置指定为 Path

    • Linux、UNIX 和 Mac OS X 用户:

      aws emr create-cluster --name "Test cluster" --release-label emr-4.0.0 \ --use-default-roles --ec2-attributes KeyName=myKey \ --applications Name=Hive Name=Pig \ --instance-count 3 --instance-type m5.xlarge \ --bootstrap-actions Path="s3://elasticmapreduce/bootstrap-actions/download.sh"
    • Windows 用户:

      aws emr create-cluster --name "Test cluster" --release-label emr-4.2.0 --use-default-roles --ec2-attributes KeyName=myKey --applications Name=Hive Name=Pig --instance-count 3 --instance-type m5.xlarge --bootstrap-actions Path="s3://elasticmapreduce/bootstrap-actions/download.sh"

    如果不使用 --instance-groups 参数指定实例计数,则将启动单个主节点,其余实例将作为核心节点启动。所有节点都使用该命令中指定的实例类型。

    注意

    如果您之前未创建默认 Amazon EMR 服务角色和 EC2 实例配置文件,请先键入 aws emr create-default-roles 创建它们,然后再键入 create-cluster 子命令。

    有关在 AWS CLI 中使用 Amazon EMR 命令的更多信息,请参阅https://docs.aws.amazon.com/cli/latest/reference/emr

使用自定义引导操作将对象从 Amazon S3 复制到每个节点

安装应用程序前,您可以使用引导操作将对象从 Amazon S3 复制到集群中的每个节点。AWS CLI 安装在集群的每个节点上,因此您的引导操作可以调用 AWS CLI 命令。

下面的示例演示了一个简单的引导操作脚本,即将一个文件 myfile.jar 从 Amazon S3 复制到每个集群节点上的本地文件夹 /mnt1/myfolder 中。此脚本保存到 Amazon S3 上,使用的文件名为 copymyfile.sh,其中包含以下内容。

#!/bin/bash aws s3 cp s3://amzn-s3-demo-bucket/myfilefolder/myfile.jar /mnt1/myfolder

在启动集群时,您可以指定脚本。以下 AWS CLI 示例展示了这一点:

aws emr create-cluster --name "Test cluster" --release-label emr-7.3.0 \ --use-default-roles --ec2-attributes KeyName=myKey \ --applications Name=Hive Name=Pig \ --instance-count 3 --instance-type m5.xlarge \ --bootstrap-actions Path="s3://amzn-s3-demo-bucket/myscriptfolder/copymyfile.sh"