创建引导操作以使用 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-Hadoop
和 configure-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 区域 中。
添加自定义引导操作
使用自定义引导操作将对象从 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"