

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 创建引导操作以使用 Amazon EMR 集群安装其他软件
<a name="emr-plan-bootstrap"></a>

您可以使用*引导操作*安装其它软件或自定义集群实例的配置。引导操作是在 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 版本自定义集群和应用程序配置](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-3x-customizeappconfig.html)。

## 引导操作基础
<a name="bootstrapUses"></a>

默认以 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` 错误代码标识引导操作所导致的故障。

## 带条件运行引导操作
<a name="emr-bootstrap-runif"></a>

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

```
#!/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`

## 关闭操作
<a name="bootstrap_Shutown"></a>

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

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

**注意**  
使用 Amazon EMR 版本 4.0 及更高版本时，必须在主节点上手动创建 `/mnt/var/lib/instance-controller/public/shutdown-actions/` 目录。默认情况下，该目录不存在；但一经创建，该目录中的脚本可在关机前运行。有关连接主节点以创建目录的更多信息，请参阅[使用 SSH 连接到 Amazon EMR 集群主节点](emr-connect-master-node-ssh.md)。

## 使用自定义引导操作
<a name="bootstrapCustom"></a>

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

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

**Topics**
+ [添加自定义引导操作](#custom-bootstrap)
+ [使用自定义引导操作将对象从 Amazon S3 复制到每个节点](#CustomBootstrapCopyS3Object)

### 添加自定义引导操作
<a name="custom-bootstrap"></a>

------
#### [ Console ]

**使用控制台通过引导操作创建集群**

1. [登录 AWS 管理控制台，然后在 /emr 上打开亚马逊 EMR 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/emr)

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择 **Create cluster**（创建集群）。

1. 在 **Bootstrap actions**（引导操作）下，选择 **Add**（添加），为操作指定名称、脚本位置和可选参数。选择 **Add bootstrap action**（添加引导操作）。

1. （可选）添加更多引导操作。

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

1. 要启动集群，选择 **Create cluster**（创建集群）。

------
#### [ CLI ]

**要使用自定义引导操作创建集群，请使用 AWS CLI**

使用包含引导操作时，请 AWS CLI 将`Path`和指定`Args`为逗号分隔的列表。以下示例未使用参数列表。
+ 要使用自定义引导操作启动集群，请键入以下命令，替换*myKey*为您的 EC2 key pair 的名称。包含 `--bootstrap-actions` 参数并将引导脚本位置指定为 `Path`。
  + Linux、UNIX 和 Mac OS X 用户：

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

    ```
    1. 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` 子命令。

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

------

### 使用自定义引导操作将对象从 Amazon S3 复制到每个节点
<a name="CustomBootstrapCopyS3Object"></a>

安装应用程序前，您可以使用引导操作将对象从 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.12.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"
```