

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

# 在 Amazon EMR 集群上运行命令和脚本
<a name="emr-commandrunner"></a>

本主题介绍如何作为步骤在集群上运行命令或脚本。作为步骤运行命令或脚本是[将工作提交到集群](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-work-with-steps.html)的其中一种方式，在以下情况下非常有用：
+ 当您未允许 SSH 访问您的 Amazon EMR 集群时
+ 当你想运行 bash 或 shell 命令来排除集群故障时

您可以在创建集群时或者在集群处于 `WAITING` 状态时运行脚本。要在步骤处理开始前运行脚本，您可使用引导操作。有关引导操作更多信息，请参阅《Amazon EMR 管理指南》**中的[创建引导操作以安装其它软件](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-bootstrap.html)。

Amazon EMR 提供以下工具来帮助您运行脚本、命令和其他集群上的程序。您可以使用 Amazon EMR 管理控制台或 AWS CLI调用所有工具。

`command-runner.jar`  
位于集群的 Amazon EMR AMI 上。您可以使用 `command-runner.jar` 在集群上运行命令。你没有使用其完整路径指定 `command-runner.jar`。

`script-runner.jar`  
Amazon S3 托管在 `s3://<region>.elasticmapreduce/libs/script-runner/script-runner.jar`，其中 `<region>` 是 Amazon EMR 集群所在的区域。您可以使用 `script-runner.jar` 以在集群上运行本地或 Amazon S3 上保存的脚本。当您提交步骤时，您必须指定 `script-runner.jar` 的完整 URI。

## 提交自定义 JAR 步骤以运行脚本或命令
<a name="emr-commandrunner-examples"></a>

以下 AWS CLI 示例说明了 Amazon EMR `script-runner.jar` 上`command-runner.jar`和上的一些常见用例。

**Example ：使用 `command-runner.jar` 在集群上运行命令**  
当您使用 `command-runner.jar`时，您可以在步骤的参数列表中指定命令、选项和值。  
以下 AWS CLI 示例向正在调用的`command-runner.jar`正在运行的集群提交一个步骤。`Args`列表中的指定命令将*my-script.sh*从 Amazon S3 调用的脚本下载到 hadoop 用户主目录中。然后，该命令修改脚本的权限并运行*my-script.sh*。  
使用时 AWS CLI，`Args`列表中的项目应以逗号分隔，列表元素之间不应有空格。例如，使用 `Args=[example-command,example-option,"example option value"]` 而不是 `Args=[example-command, example-option, "example option value"]`。  

```
aws emr add-steps \
--cluster-id j-2AXXXXXXGAPLF \
--steps Type=CUSTOM_JAR,Name="Download a script from S3 change its permissions and run it",ActionOnFailure=CONTINUE,Jar=command-runner.jar,Args=[bash,-c,"aws s3 cp s3://amzn-s3-demo-bucket/my-script.sh /home/hadoop; chmod u+x /home/hadoop/my-script.sh; cd /home/hadoop; ./my-script.sh"]
```

**Example ：使用 `script-runner.jar`在集群上运行脚本**  
当您使用 `script-runner.jar`时，在步骤的参数列表中指定想要运行的脚本。  
以下 AWS CLI 示例向正在调用的`script-runner.jar`正在运行的集群提交一个步骤。在本例中，调用的脚本存储在 *my-script.sh* Amazon S3 上。您还可以指定存储在集群主节点 (master node) 的本地脚本。  

```
aws emr add-steps \
--cluster-id j-2AXXXXXXGAPLF \
--steps Type=CUSTOM_JAR,Name="Run a script from S3 with script-runner.jar",ActionOnFailure=CONTINUE,Jar=s3://us-west-2.elasticmapreduce/libs/script-runner/script-runner.jar,Args=[s3://amzn-s3-demo-bucket/my-script.sh]
```

## 其他使用 `command-runner.jar` 的方法
<a name="emr-commandrunner-other-uses"></a>

您还可以借助类似于 `spark-submit` 或 `hadoop-streaming` 的工具，使用 `command-runner.jar` 将工作提交至集群。当您使用 `command-runner.jar` 启动应用程序时，您指定 `CUSTOM_JAR` 作为步骤类型而不是使用类似于 `SPARK`、`STREAMING` 或者 `PIG` 的值。工具可用性取决于您在集群上安装的应用程序。

以下示例命令借助 `spark-submit` 使用`command-runner.jar` 提交步骤。该`Args`列表指定`spark-submit`为命令，然后是*my-app.py*带有参数和值的 Spark 应用程序的 Amazon S3 URI。

```
aws emr add-steps \
--cluster-id j-2AXXXXXXGAPLF \
--steps Type=CUSTOM_JAR,Name="Run spark-submit using command-runner.jar",ActionOnFailure=CONTINUE,Jar=command-runner.jar,Args=[spark-submit,S3://amzn-s3-demo-bucket/my-app.py,ArgName1,ArgValue1,ArgName2,ArgValue2]
```

下表列出了通过 `command-runner.jar` 您可以使用的其他工具。


****  

| 工具名称 | 说明 | 
| --- | --- | 
| hadoop-streaming | 提交 Hadoop 流式处理程序。在控制台和某些游戏中 SDKs，这是一个直播步骤。 | 
| hive-script | 运行 Hive 脚本。在控制台中 SDKs，这是 Hive 的一步。 | 
| pig-script | 运行 Pig 脚本。在控制台中 SDKs，这是 Pig 的步骤。 | 
| spark-submit |  运行 Spark 应用程序。在控制台中，这是 Spark 步骤。  | 
| hadoop-lzo | 在目录上运行 [Hadoop LZO 索引器](https://github.com/kevinweil/hadoop-lzo/blob/master/README.md)。 | 
| s3-dist-cp | 将大量数据从 Amazon S3 分布式复制到 HDFS。有关更多信息，请参阅[S3 DistCp (s3-dist-cp)](UsingEMR_s3distcp.md)。 | 