

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon EMR 叢集上執行命令和指令碼
<a name="emr-commandrunner"></a>

本主題涵蓋如何作為步驟在叢集上執行命令或指令碼。作為步驟執行命令或指令碼是[將工作提交至叢集](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-work-with-steps.html)的多種方法之一，在以下情況下非常有用：
+ 當您沒有 Amazon EMR 叢集的 SSH 存取權時
+ 當您想要執行 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`  
 您可以使用 `script-runner.jar`，來執行儲存在本機或叢集的 Amazon S3 上的指令碼。  
 對於 Amazon EMR 7.13 及更高版本，此 jar 位於叢集的 Amazon EMR AMI 上。您可以在不使用其完整 URI `script-runner.jar`的情況下指定 。  
對於 Amazon EMR 7.12 及更低版本，此 jar 託管在 Amazon S3 上，`s3://{{<region>}}.elasticmapreduce/libs/script-runner/script-runner.jar`其中 `{{<region>}}`是 Amazon EMR 叢集所在的區域。在提交步驟時，您必須指定 `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 上。您還可以指定儲存在叢集主節點上的本機指令碼。  
 當叢集使用 Amazon EMR 7.13 或更新版本時，您可以指定 `script-runner.jar`而不使用其完整路徑：  

```
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=script-runner.jar,Args=[{{s3://amzn-s3-demo-bucket/my-script.sh}}]
```
 當叢集使用 Amazon EMR 7.12 或更低版本時，您必須在提交步驟`script-runner.jar`時指定 的完整 URI：  

```
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>

您還可以使用 `command-runner.jar` 透過 `spark-submit` 或 `hadoop-streaming` 等工具將工作提交至叢集。使用 `command-runner.jar` 啟動應用程式時，您可以指定 `CUSTOM_JAR` 作為步驟類型，而不是使用 `SPARK`、`STREAMING` 或 `PIG` 之類的值。工具可用性視您在叢集上安裝的應用程式而異。

下列範例命令使用 `command-runner.jar` 透過 `spark-submit` 提交步驟。`Args` 清單會指定 `spark-submit` 作為命令，後接具有參數和值的 Spark 應用程式 {{my-app.py}} 的 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` 執行的其他工具。


****  

| 工具名稱 | Description | 
| --- | --- | 
| hadoop-streaming | 提交 Hadoop 串流程式。在主控台和一些軟體開發套件，這算是一個串流處理步驟。 | 
| hive-script | 執行 Hive 指令碼。在主控台和一些軟體開發套件，此屬一個 Hive 步驟。 | 
| pig-script | 執行 Pig 指令碼。在主控台和一些軟體開發套件，此屬一個 Pig 步驟。 | 
| spark-submit | 執行 Spark 應用程式。在主控台中，此屬一個 Spark 步驟。 | 
| hadoop-lzo | 在目錄上執行 [Hadoop LZO indexer](https://github.com/kevinweil/hadoop-lzo/blob/master/README.md)。 | 
| s3-dist-cp | 將大量資料從 Amazon S3 分散式複製到 HDFS。如需詳細資訊，請參閱[S3DistCp (s3-dist-cp)](UsingEMR_s3distcp.md)。 | 