

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

# 使用 Amazon EMR 舊版 AMI 的 Spark 應用程式詳細資訊
<a name="emr-3x-spark"></a>

## 以互動方式或以批次模式使用 Spark
<a name="emr-3x-spark-interactive-batch"></a>

Amazon EMR 可讓您以兩種模式執行 Spark 應用程式：
+ 互動性
+ 批次

當您使用主控台或 啟動長時間執行的叢集時 AWS CLI，您可以使用 SSH 以 Hadoop 使用者身分連接至主節點，並使用 Spark shell 以互動方式開發和執行 Spark 應用程式。以互動方式使用 Spark 可讓您以較在批次環境中更輕鬆的方式來原型或測試 Spark 應用程式。在互動式模式成功修訂 Spark 應用程式後，您可以將本機檔案系統中該應用程式 JAR 或 Python 程式放在 Amazon S3 上的叢集主節點。然後，您可以批次工作流程的方式提交應用程式。

在批次模式中，您會將 Spark 指令碼上傳至 Amazon S3 或本機主節點檔案系統，然後將工作提交到叢集作為一步驟。您可以將 Spark 步驟提交到長時間執行的叢集或暫時性叢集。

## 使用安裝的 Spark 建立叢集
<a name="emr-3x-spark-install"></a>

**使用主控台並透過安裝好的 Spark 來啟動叢集**

1. 導覽至新的 Amazon EMR 主控台，然後從側邊導覽選取**切換至舊主控台**。如需有關切換至舊主控台時預期情況的詳細資訊，請參閱[使用舊主控台](https://docs.aws.amazon.com/emr/latest/ManagementGuide/whats-new-in-console.html#console-opt-in)。

1. 選擇 **Create Cluster** (建立叢集)。

1. 對於 **Software Configuration (軟體組態)**，選擇您需要的 AMI 發行版本。

1.  對於 **Applications to be installed (要安裝的應用程式)**，從清單中選擇 **Spark (Spark)**，然後選擇 ** Configure and add (設定和新增)**。

1. 新增引數來視需要變更 Spark 組態。如需詳細資訊，請參閱[設定 Spark](#emr-3x-spark-configure)。選擇**新增**。

1.  依需要選取其他選項，然後選擇 **Create cluster (建立叢集)**。

以下範例說明如何使用 Java 透過 Spark 建立叢集：

```
AmazonElasticMapReduceClient emr = new AmazonElasticMapReduceClient(credentials);
SupportedProductConfig sparkConfig = new SupportedProductConfig()
			.withName("Spark");

RunJobFlowRequest request = new RunJobFlowRequest()
			.withName("Spark Cluster")
			.withAmiVersion("3.11.0")
			.withNewSupportedProducts(sparkConfig)
			.withInstances(new JobFlowInstancesConfig()
				.withEc2KeyName("myKeyName")
				.withInstanceCount(1)
				.withKeepJobFlowAliveWhenNoSteps(true)
				.withMasterInstanceType("m3.xlarge")
				.withSlaveInstanceType("m3.xlarge")
			);			
RunJobFlowResult result = emr.runJobFlow(request);
```

## 設定 Spark
<a name="emr-3x-spark-configure"></a>

透過執行位於 [awslabs/emr-bootstrap-actions/spark repository on Github](https://github.com/awslabs/emr-bootstrap-actions/tree/master/spark) 中的引導操作來在建立叢集時設定 Spark。如需引導操作接收的引數，請參閱在該儲存庫中的 [ README](https://github.com/aws-samples/emr-bootstrap-actions/blob/master/spark/examples/README.md)。引導操作會在 `$SPARK_CONF_DIR/spark-defaults.conf` 檔案中設定屬性。如需設定的詳細資訊，請參閱 Spark 文件中的 Spark 組態主題。您可以在以下 URL 使用您正在安裝之 Spark 的版本號碼來取代「最新」，例如，`2.2.0`[http://spark.apache.org/docs/latest/configuration.html](http://spark.apache.org/docs/latest/configuration.html)。

您也可以在每個應用程式提交時動態設定 Spark。可自動最大化執行器的資源分配的設定可使用 `spark` 組態檔案來取得。如需詳細資訊，請參閱[覆寫 Spark 預設組態設定](#emr-3x-spark-dynamic-configuration)。

### 變更 Spark 預設設定
<a name="emr-3x-spark-default-settings"></a>

以下範例說明如何使用 AWS CLI透過將 `spark.executor.memory` 設為 2G 來建立叢集：

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

```
aws emr create-cluster --name "Spark cluster" --ami-version 3.11.0 \
--applications Name=Spark, Args=[-d,spark.executor.memory=2G] --ec2-attributes KeyName=myKey \
--instance-type m3.xlarge --instance-count 3 --use-default-roles
```

### 將工作提交到 Spark
<a name="emr-3x-spark-submit-work"></a>

若要將工作提交到叢集，使用步驟來在 EMR 叢集上執行 `spark-submit` 指令碼。在 `addJobFlowSteps`AmazonElasticMapReduceClient[ 中使用 ](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/elasticmapreduce/AmazonElasticMapReduceClient.html) 方法來新增步驟：

```
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
AmazonElasticMapReduceClient emr = new AmazonElasticMapReduceClient(credentials);
StepFactory stepFactory = new StepFactory();
AddJobFlowStepsRequest req = new AddJobFlowStepsRequest();
req.withJobFlowId("j-1K48XXXXXXHCB");

List<StepConfig> stepConfigs = new ArrayList<StepConfig>();
		
StepConfig sparkStep = new StepConfig()
	.withName("Spark Step")
	.withActionOnFailure("CONTINUE")
	.withHadoopJarStep(stepFactory.newScriptRunnerStep("/home/hadoop/spark/bin/spark-submit","--class","org.apache.spark.examples.SparkPi","/home/hadoop/spark/lib/spark-examples-1.3.1-hadoop2.4.0.jar","10"));

stepConfigs.add(sparkStep);
req.withSteps(stepConfigs);
AddJobFlowStepsResult result = emr.addJobFlowSteps(req);
```

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

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

```
/home/hadoop/spark/bin/spark-submit --executor-memory 1g --class org.apache.spark.examples.SparkPi /home/hadoop/spark/lib/spark-examples*.jar 10
```

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

```
--executor-memory 1g --class org.apache.spark.examples.SparkPi /home/hadoop/spark/lib/spark-examples*.jar 10
```

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