

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

# 将工作提交到 Amazon EMR 集群
<a name="emr-work-with-steps"></a>

此部分描述您可用于向 Amazon EMR 集群提交工作的方法。您可以通过添加步骤或以交互方式向主节点提交 Hadoop 任务的形式向集群提交工作。

向集群提交步骤时，请考虑以下步骤行为规则：
+ 步骤 ID 最多可包含 256 个字符。
+ 一个集群中最多可以有 256 个待处理和正在运行的步骤。
+ 即使集群上运行有 256 个活动步骤，您可以采用交互方式向主节点提交任务。您可以在长时间运行的集群的生命周期内提交不限数量的步骤，但是，在给定时间只能有 256 个步骤处于 RUNNING 或 PENDING 状态。
+ 对于 Amazon EMR 版本 4.8.0 和更高版本（版本 5.0.0 除外），您可以取消待处理步骤。有关更多信息，请参阅 [将工作提交到 Amazon EMR 集群时取消步骤](emr-cancel-steps.md)。
+ 使用 Amazon EMR 版本 5.28.0 和更高版本，可以取消待处理步骤和正在运行的步骤。您还可以选择并行运行多个步骤以提高集群利用率并节省成本。有关更多信息，请参阅 [向 Amazon EMR 提交工作时并行运行多个步骤的注意事项](emr-concurrent-steps.md)。

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

**Topics**
+ [使用 Amazon EMR 管理控制台向集群添加步骤](emr-add-steps-console.md)
+ [使用向 Amazon EMR 集群添加步骤 AWS CLI](add-step-cli.md)
+ [向 Amazon EMR 提交工作时并行运行多个步骤的注意事项](emr-concurrent-steps.md)
+ [查看将工作提交到 Amazon EMR 集群后的步骤](emr-view-steps.md)
+ [将工作提交到 Amazon EMR 集群时取消步骤](emr-cancel-steps.md)

# 使用 Amazon EMR 管理控制台向集群添加步骤
<a name="emr-add-steps-console"></a>

在 AWS 管理控制台中，请按照以下操作步骤将步骤添加到集群中。有关如何为特定大数据应用程序提交步骤的详细信息，请参阅 [Amazon EMR Release Guide](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-release-components.html)**：
+ [提交自定义 JAR 步骤](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-launch-custom-jar-cli.html) 
+ [提交 Hadoop 流式传输步骤](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/CLI_CreateStreaming.html) 
+ [提交 Spark 步骤](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-submit-step.html) 
+ [提交 Pig 步骤](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-pig-launch.html#ConsoleCreatingaPigJob) 
+ [将命令或脚本作为步骤运行](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-launch-custom-jar-cli.html) 
+ [将值传递到运行 Hive 脚本的步骤中](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-differences.html#emr-hive-additional-features) 

## 在创建集群过程中添加步骤
<a name="emr-add-steps-console-cluster-creation"></a>

从中 AWS 管理控制台，您可以在创建集群时添加步骤。

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

**使用控制台创建集群时添加步骤**

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

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

1. 在 **Steps**（步骤）下，选择 **Add step**（添加步骤）。在 **Add Step**（添加步骤）对话框的字段中输入相应值。有关格式化步骤参数的信息，请参阅 [添加步骤参数](#emr-add-steps-console-arguments)。选项因步骤类型而异。要添加步骤并退出对话框，请选择**添加步骤**。

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

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

------

## 向正在运行的集群添加步骤
<a name="emr-add-steps-console-running-cluster"></a>

使用 AWS 管理控制台，您可以在禁用自动终止选项的情况下向集群添加步骤。

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

**使用控制台向正在运行的集群添加步骤**

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

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择要更新的集群。

1. 在集群详细信息页面的 **Steps**（步骤）选项卡上，选择 **Add step**（添加步骤）。要克隆现有步骤，请选择 **Actions**（操作）下拉菜单，然后选择 **Clone step**（克隆步骤）。

1. 在 **Add Step**（添加步骤）对话框的字段中输入相应值。选项因步骤类型而异。要添加步骤并退出对话框，请选择 **Add step**（添加步骤）。

------

## 修改正在运行的集群中的步骤并发级别
<a name="emr-add-steps-console-modify-concurrency"></a>

使用 AWS 管理控制台，您可以修改正在运行的集群中的步骤并发级别。

**注意**  
您只能使用 Amazon EMR 版本 5.28.0 和更高版本并行运行多个步骤。

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

**使用控制台修改正在运行的集群中的步骤并发性**

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

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择要更新的集群。集群必须处于运行状态才能更改其并发属性。

1. 在集群详细信息页面的 **Steps**（步骤）选项卡上，找到 **Attributes**（属性）部分。选择 **Edit**（编辑）以更改并发级别。请输入 1 到 256 之间的值。

------

## 添加步骤参数
<a name="emr-add-steps-console-arguments"></a>

使用 AWS 管理控制台 向集群添加步骤时，可以在 “参数” 字段中为该步骤指定**参数**。您必须使用空格、字符组成的两边字符串参数*以及*带引号的空格分隔参数。

**Example ：参数正确**  
以下示例参数的格式正确 AWS 管理控制台，最后一个字符串参数前后加了引号。  

```
bash -c "aws s3 cp s3://amzn-s3-demo-bucket/my-script.sh ."
```
您还可以为了实现可读性，将每个参数放在单独的行中，如下面的示例所示。  

```
bash 
-c 
"aws s3 cp s3://amzn-s3-demo-bucket/my-script.sh ."
```

**Example ：参数不正确**  
以下示例参数的格式不正确，不适用于 AWS 管理控制台。请注意，最后一个字符串参数 `aws s3 cp s3://amzn-s3-demo-bucket/my-script.sh .` 含有空格，没有引号。  

```
bash -c aws s3 cp s3://amzn-s3-demo-bucket/my-script.sh .
```

# 使用向 Amazon EMR 集群添加步骤 AWS CLI
<a name="add-step-cli"></a>

以下过程演示如何使用 AWS CLI向新创建的集群和正在运行的集群添加步骤。两个示例都使用 `--steps` 子命令向集群添加步骤。

**在集群创建过程中添加步骤**
+ 键入以下命令以创建集群并添加一个 Apache Pig 步骤。确保将 *`myKey`* 替换为您的 Amazon EC2 密钥对的名称。

  ```
  1. aws emr create-cluster --name "Test cluster" \
  2. --applications Name=Spark \
  3. --use-default-roles \
  4. --ec2-attributes KeyName=myKey \
  5. --instance-groups InstanceGroupType=PRIMARY,InstanceCount=1,InstanceType=m5.xlarge InstanceGroupType=CORE,InstanceCount=2,InstanceType=m5.xlarge \
  6. --steps '[{"Args":["spark-submit","--deploy-mode","cluster","--class","org.apache.spark.examples.SparkPi","/usr/lib/spark/examples/jars/spark-examples.jar","5"],"Type":"CUSTOM_JAR","ActionOnFailure":"CONTINUE","Jar":"command-runner.jar","Properties":"","Name":"Spark application"}]'
  ```
**注意**  
参数列表因步骤类型而异。

  默认情况下，步骤并发级别为 `1`。您可以在创建集群时使用 `StepConcurrencyLevel` 参数设置步骤并发级别。

  输出是类似于以下内容的集群标识符。

  ```
  1. {
  2.     "ClusterId": "j-2AXXXXXXGAPLF"
  3. }
  ```

**向正在运行的集群添加步骤**
+ 键入以下命令以向正在运行的集群添加步骤。使用您自己的集群 ID 替换 `j-2AXXXXXXGAPLF`。

  ```
  aws emr add-steps --cluster-id j-2AXXXXXXGAPLF \
  --steps '[{"Args":["spark-submit","--deploy-mode","cluster","--class","org.apache.spark.examples.SparkPi","/usr/lib/spark/examples/jars/spark-examples.jar","5"],"Type":"CUSTOM_JAR","ActionOnFailure":"CONTINUE","Jar":"command-runner.jar","Properties":"","Name":"Spark application"}]'
  ```

   输出是类似于以下内容的步骤标识符。

  ```
  1. {
  2.     "StepIds": [
  3. 	"s-Y9XXXXXXAPMD"
  4.     ]
  5. }
  ```

**在正在运行的集群 StepConcurrencyLevel 中修改**

1. 在正在运行的集群中，您可以使用 `ModifyCluster` API 修改 `StepConcurrencyLevel`。例如，键入以下命令将 `StepConcurrencyLevel` 增加到 `10`。使用您的集群 ID 替换 `j-2AXXXXXXGAPLF`。

   ```
   aws emr modify-cluster --cluster-id j-2AXXXXXXGAPLF --step-concurrency-level 10
   ```

1. 输出类似于以下内容。

   ```
   {
   "StepConcurrencyLevel": 10
   }
   ```

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

# 向 Amazon EMR 提交工作时并行运行多个步骤的注意事项
<a name="emr-concurrent-steps"></a>

向 Amazon EMR 提交工作时，并行运行多个步骤需要对资源规划和集群行为预期做出初步决定。这里详细介绍了这些内容。
+ 并行运行的步骤可以按任何顺序完成，但队列中的待处理步骤要按照它们提交的顺序转换为运行状态。
+ 为集群选择步骤并发级别时，必须考虑主节点实例类型是否满足用户工作负载的内存要求。主步骤执行程序进程在每个步骤的主节点上运行。与一次运行一个步骤相比，并行运行多个步骤要求主节点拥有更多的内存和更高的 CPU 利用率。
+ 要对并发步骤实现复杂的计划和资源管理，您可以使用 YARN 计划功能（如 `FairScheduler` 或 `CapacityScheduler`）。例如，您可以将 `FairScheduler` 与 `queueMaxAppsDefault` 集合一起使用，以防止一次运行超过特定数量的作业。
+ 步骤并发级别取决于资源管理器的配置。例如，如果 YARN 配置的并行度仅为 `5`，则即使 `StepConcurrencyLevel` 设置为 `10`，您也只能让五个 YARN 应用程序并行运行。有关配置资源管理器的更多信息，请参阅《Amazon EMR 版本指南**》中的[配置应用程序](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html)。
+ 当集群的步骤并发级别大于 1 时，不能添加具有 `ActionOnFailure`（CONTINUE 除外）的步骤。
+ 如果集群的步骤并发级别大于 1，步骤 `ActionOnFailure` 功能将不会激活。
+ 如果集群的步骤并发级别为 `1` 但有多个运行步骤，则 `TERMINATE_CLUSTER ActionOnFailure` 可能会激活，但 `CANCEL_AND_WAIT ActionOnFailure` 不会。当集群步骤并发级别大于一时会出现这种边缘情况，但在运行多个步骤时会减少发生该情况。
+ 使用 EMR 自动扩展可以基于 YARN 资源向上和向下扩展，以防止资源争用。有关更多信息，请参阅《[Amazon EMR 管理指南](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-automatic-scaling.html)》中的*将自动伸缩与实例组的自定义策略结合使用*。
+ 当您降低步骤并发级别时，EMR 允许在减少步骤数之前完成任何正在运行的步骤。如果资源因集群运行的并发步骤太多而耗尽，我们建议手动取消所有正在运行的步骤以释放资源。

# 查看将工作提交到 Amazon EMR 集群后的步骤
<a name="emr-view-steps"></a>

您最多可以看到 Amazon EMR 在过去七天内完成的 10000 个步骤。您还可以随时查看 Amazon EMR 完成的 1000 个步骤。此总数包括用户提交的步骤和系统步骤。

如果您在集群达到 1000 个步骤记录限制后提交新的步骤，Amazon EMR 将删除状态为“已完成”、“已取消”或“失败”超过 7 天的非活动用户提交的步骤。如果您提交的步骤超出 10000 个步骤记录限制，Amazon EMR 会删除用户提交的非活动步骤记录，无论其非活动持续时间长短。Amazon EMR 不会从日志文件中删除这些记录。Amazon EMR 会将它们从 AWS 控制台中删除，当您使用 AWS CLI 或 API 检索集群信息时，它们不会被返回。任何时候都不会删除系统步骤记录。

可以查看的步骤信息取决于用于检索集群信息的机制。下表显示每个可用选项所返回的步骤信息。

 


| Option | DescribeJobFlow 或者--描述--jobflow | ListSteps 或列表步骤 | 
| --- | --- | --- | 
| SDK | 256 个步骤 | 最多 10000 个步骤 | 
| Amazon EMR CLI | 256 个步骤 | NA | 
| AWS CLI | NA | 最多 10000 个步骤 | 
| API | 256 个步骤 | 最多 10000 个步骤 | 

# 将工作提交到 Amazon EMR 集群时取消步骤
<a name="emr-cancel-steps"></a>

向集群提交工作时，您可以从 AWS 管理控制台 AWS CLI、或 Amazon EMR 中取消待处理和正在运行的步骤。API。

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

**使用控制台取消步骤**

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

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择要更新的集群。

1. 在集群详细信息页面的 **Steps**（步骤）选项卡上，选中要取消的步骤旁边的复选框。选择 **Actions**（操作）下拉菜单，然后选择 **Cancel steps**（取消步骤）。

1. 在 **Cancel the step**（取消步骤）对话框中，选择取消步骤并等待退出，或者取消步骤并强制退出。然后，选择 **Confirm（确认）**。

1. **Steps**（步骤）表中的步骤状态更改为 `CANCELLED`。

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

**要使用取消订阅 AWS CLI**
+ 使用 `aws emr cancel-steps` 命令指定集群和要取消的步骤。以下示例演示了用于取消两个步骤的 AWS CLI 命令。

  ```
  aws emr cancel-steps --cluster-id j-2QUAXXXXXXXXX \
  --step-ids s-3M8DXXXXXXXXX s-3M8DXXXXXXXXX \
  --step-cancellation-option SEND_INTERRUPT
  ```

使用 Amazon EMR 版本 5.28.0，可以在取消步骤时选择以下两个取消选项之一作为 `StepCancellationOption` 参数。
+ `SEND_INTERRUPT`：这是默认选项。当收到步骤取消请求时，EMR 会向步骤发送 `SIGTERM` 信号。将 `SIGTERM` 信号处理程序添加到您的步骤逻辑，以捕获此信号并终止子步骤进程，或等待它们完成处理。
+ `TERMINATE_PROCESS`：选择此选项后，EMR 会向步骤及其所有子进程发送 `SIGKILL` 信号，然后这些进程会立即终止。

------

**取消步骤的注意事项**
+ 取消正在运行的步骤或待处理步骤将从活动步骤计数中删除该步骤。
+ 假设没有更改 `stepConcurrencyLevel`，取消正在运行的步骤并不允许待处理步骤开始运行。
+ 取消正在运行的步骤不会触发步骤 `ActionOnFailure`。
+ 对于 EMR 5.32.0 及更高版本，`SEND_INTERRUPT StepCancellationOption` 会向步骤子进程发送 `SIGTERM` 信号。您应该注意此信号并正常进行清除和关闭。`TERMINATE_PROCESS StepCancellationOption` 向步骤子进程及其所有后代进程发送 `SIGKILL` 信号；但是，异步进程不受影响。