

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

# 添加 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. [在 /emr 上打开亚马逊 EMR 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/emr/)

1. 在 **Cluster List (集群列表)** 中，选择您的集群的名称。

1. 滚动到 **Steps (步骤)** 部分并展开它，然后选择 **Add step (添加步骤)**。

1. 在 **Add Step (添加步骤)** 对话框中：
   + 对于 **Step type (步骤类型)**，选择 **Spark application (Spark 应用程序)**。
   + 对于 **Name**（名称），接受原定设置名称（Spark application）或键入一个新名称。
   + 对于 **Deploy mode (部署模式)**，选择 **Client (客户端)** 或 **Cluster (集群)** 模式。客户端模式在集群的主实例上启动驱动程序，而集群模式在集群上启动驱动程序。对于客户端模式，驱动程序的日志输出将显示在步骤日志中，而对于集群模式，驱动程序的日志输出将显示在第一个 YARN 容器的日志中。有关更多信息，请参阅 Apache Spark 文档中的[集群模式概览](https://spark.apache.org/docs/latest/cluster-overview.html)。
   + 指定所需的 **Spark-submit options**。有关 `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. 选择**添加**。步骤会出现在控制台中，其状态为“Pending”。

1. 步骤的状态会随着步骤的运行从**“Pending”**变为**“Running”**，再变为**“Completed”**。要更新状态，请选择 **Actions (操作)** 列上方的 **Refresh (刷新)** 图标。

1. 如果您配置了日志记录，则这一步的结果将放在 Amazon EMR 控制台的 Cluster Details (集群详细信息) 页面上，位于您的步骤旁边的 **Log Files (日志文件)** 下方。在启动集群时，您可以选择在配置的日志存储桶中查找步骤信息。

**要使用 Spark 将作品提交给 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]
   ```

**使用 SDK for Java 向 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)主题。