

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

# 新增 Spark 步驟
<a name="emr-spark-submit-step"></a>

您可以使用 Amazon EMR 步驟來將工作提交到在 EMR 叢集上安裝的 Spark 架構。如需詳細資訊，請參閱《Amazon EMR 管理指南》中的[步驟](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-overview.html#emr-overview-data-processing)。在主控台與 CLI 中，使用 Spark 應用程式步驟 (其會代表您執行 `spark-submit` 指令碼做為步驟)，來完成此動作。您透過 API 呼叫，使用 `spark-submit` 來使用步驟以叫用 `command-runner.jar`。

如需有關將應用程式提交到 Spark 的詳細資訊，請參閱 Apache Spark 文件中的[提交應用程式](https://spark.apache.org/docs/latest/submitting-applications.html)主題。

**使用主控台來提交 Spark 步驟**

1. 開啟位於 https：//[https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr/) 的 Amazon EMR 主控台。

1. 在 **Cluster List (叢集清單)** 中，選擇您的叢集名稱。

1. 向下捲動至 **Steps (步驟)** 區段並展開，接著選擇 **Add step (新增步驟)**。

1. 在 **Add Step (新增步驟)** 對話方塊中：
   + 在 **Step type (步驟類型)**，選擇 **Spark application (Spark 應用程式)**。
   + 對於 **Name (名稱)**，接受預設名稱 (Spark 應用程式) 或輸入新名稱。
   + 使用 **Deploy mode (部署模式)** 時，請選擇 **Client (用戶端)** 或 **Cluster (叢集)** 模式。用戶端模式會啟動叢集主要執行個體上的驅動程式程式，而叢集模式則會在該叢集上啟動您的驅動程式。對於客戶端模式，驅動程式的日誌輸出會出現在步驟日誌中，而對於叢集模式，驅動程式的日誌輸出會出現在第一個 YARN 容器的日誌中。如需詳細資訊，請參閱 Apache Spark 文件中的[叢集模式概觀](https://spark.apache.org/docs/latest/cluster-overview.html)。
   + 指定所需的 **Spark-submit 選項**。如需有關 `spark-submit` 選項的詳細資訊，請參閱[透過 spark-submit 啟動應用程式](https://spark.apache.org/docs/latest/submitting-applications.html#launching-applications-with-spark-submit)。
   + 對於 **Application location (應用程式位置)**，指定應用程式本機或 S3 URI 路徑。
   + 針對 **Arguments (引數)**，將欄位保留空白。
   + 針對 **Action on failure (失敗的動作)**，接受預設選項 (**Continue (繼續)**)。

1. 選擇**新增**。該步驟會出現在主控台中，且狀態為待定。

1. 隨著步驟的執行，步驟的狀態會依序從 **Pending (待定)**、**Running (執行中)** 變成 **Completed (完成)**。若要更新狀態，您可以選擇 **Actions** (動作) 欄上的 **Refresh** (重新整理) 圖示。

1. 如果您有設定記錄，步驟結果會位於**日誌檔案**下步驟旁 Amazon EMR 主控台的「叢集詳細資訊」頁面中。您可以在啟動叢集時設定的日誌儲存貯體中選擇尋找步驟資訊。

**使用 將工作提交至 Spark AWS CLI**

當您建立叢集，或是在現有叢集中使用 `aws emr add-steps` 子指令時提交步驟。

1. 如下列範例所示，使用 `create-cluster`。
**注意**  
包含 Linux 行接續字元 (\$1) 是為了提高可讀性。它們可以在 Linux 命令中移除或使用。對於 Windows，請將其移除或取代為插入符號 (^)。

   ```
   aws emr create-cluster --name "Add Spark Step Cluster" --release-label emr-7.12.0 --applications Name=Spark \
   --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3 \
   --steps Type=Spark,Name="Spark Program",ActionOnFailure=CONTINUE,Args=[--class,org.apache.spark.examples.SparkPi,/usr/lib/spark/examples/jars/spark-examples.jar,10] --use-default-roles
   ```

   替代方案是如下列範例所示，使用 `command-runner.jar`。

   ```
   aws emr create-cluster --name "Add Spark Step Cluster" --release-label emr-7.12.0 \
   --applications Name=Spark --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3 \
   --steps Type=CUSTOM_JAR,Name="Spark Program",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[spark-example,SparkPi,10] --use-default-roles
   ```
**注意**  
包含 Linux 行接續字元 (\$1) 是為了提高可讀性。它們可以在 Linux 命令中移除或使用。對於 Windows，請將其移除或取代為插入符號 (^)。

1. 或者，將步驟新增至執行中的叢集。請使用 `add-steps`。

   ```
   aws emr add-steps --cluster-id j-2AXXXXXXGAPLF --steps Type=Spark,Name="Spark Program",ActionOnFailure=CONTINUE,Args=[--class,org.apache.spark.examples.SparkPi,/usr/lib/spark/examples/jars/spark-examples.jar,10]
   ```

   替代方案是如下列範例所示，使用 `command-runner.jar`。

   ```
   aws emr add-steps --cluster-id j-2AXXXXXXGAPLF --steps Type=CUSTOM_JAR,Name="Spark Program",Jar="command-runner.jar",ActionOnFailure=CONTINUE,Args=[spark-example,SparkPi,10]
   ```

**若要使用適用於 Java 的 SDK 將工作提交給 Spark**

1. 以下範例說明如何使用 Java 透過 Spark 新增叢集步驟。

   ```
   AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
   AmazonElasticMapReduce emr = new AmazonElasticMapReduceClient(credentials);
    
   StepFactory stepFactory = new StepFactory();
   AmazonElasticMapReduceClient emr = new AmazonElasticMapReduceClient(credentials);
   AddJobFlowStepsRequest req = new AddJobFlowStepsRequest();
   req.withJobFlowId("j-1K48XXXXXXHCB");
   
   List<StepConfig> stepConfigs = new ArrayList<StepConfig>();
   		
   HadoopJarStepConfig sparkStepConf = new HadoopJarStepConfig()
   			.withJar("command-runner.jar")
   			.withArgs("spark-submit","--executor-memory","1g","--class","org.apache.spark.examples.SparkPi","/usr/lib/spark/examples/jars/spark-examples.jar","10");			
   		
   StepConfig sparkStep = new StepConfig()
   			.withName("Spark Step")
   			.withActionOnFailure("CONTINUE")
   			.withHadoopJarStep(sparkStepConf);
   
   stepConfigs.add(sparkStep);
   req.withSteps(stepConfigs);
   AddJobFlowStepsResult result = emr.addJobFlowSteps(req);
   ```

1. 檢查步驟日誌以查看步驟的結果。 AWS 管理主控台 如果您已啟用記錄功能，您可以在 中執行此操作，方法是選擇**步驟**、選取步驟，然後針對**日誌檔案**選擇 `stdout`或 `stderr`。若要查看可用的日誌，請選擇 **View Logs (檢視日誌)**。

## 覆寫 Spark 預設組態設定
<a name="dynamic-configuration"></a>

您可以根據每個應用程式覆寫 Spark 預設組態值。您可以使用基本上會將選項傳遞至 `spark-submit` 的步驟來在提交應用程式時這麼做。例如，您可以想要透過變更 `spark.executor.memory` 來變更對執行器程序分配的記憶體。您可以使用如下引數提供 `--executor-memory` 參數：

```
spark-submit --executor-memory 1g --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar 10
```

同樣地，您可以微調 `--executor-cores` 和 `--driver-memory`。在步驟中，您會將下列引數提供給步驟：

```
--executor-memory 1g --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar 10
```

您可以使用 `--conf` 選項來微調可能沒有內建參數的設定。如需有關其他可微調設定的詳細資訊，請參閱 Apache Spark 文件中的[動態載入 Spark 屬性](https://spark.apache.org/docs/latest/configuration.html#dynamically-loading-spark-properties)主題。