

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

# 在 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`  
託管在 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 上。您還可以指定儲存在叢集主節點上的本機指令碼。  

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