

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

# 執行 EMR Serverless 任務時使用 Spark 組態
<a name="jobs-spark"></a>

您可以在 `type` 參數設定為 的應用程式上執行 Spark 任務`SPARK`。任務必須與與 Amazon EMR 發行版本相容的 Spark 版本相容。例如，當您使用 Amazon EMR 6.6.0 版執行任務時，您的任務必須與 Apache Spark 3.2.0 相容。如需每個版本的應用程式版本資訊，請參閱 [Amazon EMR Serverless 發行版本](release-versions.md)。

## Spark 任務參數
<a name="spark-params"></a>

當您使用 [`StartJobRun` API](https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_StartJobRun.html) 執行 Spark 任務時，請指定下列參數。

**Topics**
+ [Spark 任務執行期角色](#spark-defaults-executionRoleArn)
+ [Spark 任務驅動程式參數](#spark-defaults-jobDriver)
+ [Spark 組態覆寫參數](#spark-defaults-configurationOverrides)
+ [Spark 動態資源配置最佳化](#spark-defaults-dynamicResourceAllocation)

### Spark 任務執行期角色
<a name="spark-defaults-executionRoleArn"></a>

使用 **`executionRoleArn`**為應用程式用來執行 Spark 任務的 IAM 角色指定 ARN。此角色必須包含下列許可：
+ 從資料所在的 S3 儲存貯體或其他資料來源讀取
+ 從 PySpark 指令碼或 JAR 檔案所在的 S3 儲存貯體或字首讀取
+ 寫入您要寫入最終輸出的 S3 儲存貯體
+ 將日誌寫入`S3MonitoringConfiguration`指定 的 S3 儲存貯體或字首
+ 如果您使用 KMS 金鑰來加密 S3 儲存貯體中的資料，則存取 KMS 金鑰
+ 如果您使用 SparkSQL，存取 AWS Glue Data Catalog

如果您的 Spark 任務讀取資料或從其他資料來源寫入資料，請在此 IAM 角色中指定適當的許可。如果您未將這些許可提供給 IAM 角色，任務可能會失敗。如需詳細資訊，請參閱 [Amazon EMR Serverless 的任務執行期角色](security-iam-runtime-role.md) 和 [儲存日誌](logging.md)。

### Spark 任務驅動程式參數
<a name="spark-defaults-jobDriver"></a>

使用 **`jobDriver`**為任務提供輸入。任務驅動程式參數只接受您要執行之任務類型的一個值。對於 Spark 任務，參數值為 `sparkSubmit`。您可以使用此任務類型，透過 Spark 提交執行 Scala、Java、PySpark 和任何其他支援的任務。Spark 任務具有下列參數：
+ **`sparkSubmitParameters`** – 這些是您要傳送至任務的其他 Spark 參數。使用此參數可覆寫預設 Spark 屬性，例如驅動程式記憶體或執行器數量，例如 `--conf`或 `--class`引數中定義的屬性。
+ **`entryPointArguments`** – 這是您要傳遞至主要 JAR 或 Python 檔案的引數陣列。應使用 entrypoint 程式碼讀取這些參數。以逗號分隔陣列中的每個引數。
+ **`entryPoint`** – 這是 Amazon S3 中您要執行的主要 JAR 或 Python 檔案的參考。如果您正在執行 Scala 或 Java JAR，`SparkSubmitParameters`請使用 `--class`引數在 中指定主要項目類別。

如需詳細資訊，請參閱[使用 spark-submit 啟動應用程式](https://spark.apache.org/docs/latest/submitting-applications.html#launching-applications-with-spark-submit)。

### Spark 組態覆寫參數
<a name="spark-defaults-configurationOverrides"></a>

使用 **`configurationOverrides`**覆寫監控層級和應用程式層級組態屬性。此參數接受具有下列兩個欄位的 JSON 物件：
+ **`monitoringConfiguration`** ‐ 使用此欄位指定您希望 EMR Serverless 任務存放 Spark 任務日誌的 Amazon S3 URL (`s3MonitoringConfiguration`)。請確定您已使用託管您應用程式的相同 AWS 帳戶 建立此儲存貯體，並在執行任務 AWS 區域 的相同 中建立此儲存貯體。
+ **`applicationConfiguration`** – 若要覆寫應用程式的預設組態，您可以在此欄位中提供組態物件。可以使用速記語法，以提供組態或參考 JSON 檔案中物件的組態。組態物件是由分類、屬性和選用的巢狀組態所組成。屬性由您想要在檔案中覆寫的設定組成。您可以在單一 JSON 物件中，為多個應用程式指定多個分類。
**注意**  
可用的組態分類會因特定 EMR Serverless 版本而有所不同。例如，自訂 Log4j `spark-driver-log4j2`和 的分類`spark-executor-log4j2`僅適用於 6.8.0 版和更新版本。

如果您在應用程式覆寫和 Spark 提交參數中使用相同的組態，Spark 提交參數會優先。組態的優先順序如下，從最高到最低：
+ EMR Serverless 在建立 時提供的組態`SparkSession`。
+ 您使用 `sparkSubmitParameters` `--conf`引數做為 一部分提供的組態。
+ 當您啟動任務時，您作為應用程式一部分提供的組態會覆寫 。
+ 您在建立應用程式`runtimeConfiguration`時作為 的一部分提供的組態。
+ Amazon EMR 用於發行版本的最佳化組態。
+ 應用程式的預設開放原始碼組態。

如需在應用程式層級宣告組態，以及在任務執行期間覆寫組態的詳細資訊，請參閱 [EMR Serverless 的預設應用程式組態](default-configs.md)。

### Spark 動態資源配置最佳化
<a name="spark-defaults-dynamicResourceAllocation"></a>

使用 `dynamicAllocationOptimization` 來最佳化 EMR Serverless 中的資源用量。在 Spark 組態分類`true`中將此屬性設定為 表示 為 EMR Serverless，以最佳化執行器資源配置，讓 Spark 請求和取消執行器的速率與 EMR Serverless 建立和釋放工作者的速率更一致。如此一來，EMR Serverless 就能在各個階段以最佳方式重複使用工作者，進而在執行具有多個階段的任務時降低成本，同時維持相同的效能。

此屬性適用於所有 Amazon EMR 發行版本。

以下是 的範例組態分類`dynamicAllocationOptimization`。

```
[
  {
    "Classification": "spark",
    "Properties": {
      "dynamicAllocationOptimization": "true"
    }
  }
]
```

如果您使用的是動態配置最佳化，請考慮下列事項：
+ 此最佳化適用於您啟用動態資源配置的 Spark 任務。
+ 為了實現最佳成本效益，我們建議您根據您的工作負載，使用任務層級設定`spark.dynamicAllocation.maxExecutors`或[應用程式層級最大容量](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/app-behavior.html#max-capacity)設定來設定工作者上擴展範圍。
+ 您可能不會注意到更簡單任務的成本改善。例如，如果您的任務在小型資料集上執行或完成在一個階段中執行，Spark 可能不需要更多執行器或多個擴展事件。
+ 具有一系列大型階段、較小階段，然後再次大型階段的任務，可能會在任務執行時間中遇到迴歸。由於 EMR Serverless 更有效率地使用資源，因此可能會減少較大階段的可用工作者，進而延長執行時間。

## Spark 任務屬性
<a name="spark-defaults"></a>

下表列出選用的 Spark 屬性及其預設值，您可以在提交 Spark 任務時覆寫這些屬性。


**選用 Spark 屬性和預設值**  

| 金錀 | Description | 預設值 | 
| --- | --- | --- | 
| spark.archives | Spark 擷取到每個執行器工作目錄的以逗號分隔的封存清單。支援的檔案類型包括 .jar .tar.gz、 .tgz和 .zip。若要指定要擷取的目錄名稱，請在您要擷取的檔案名稱\$1後面新增 。例如 file.zip\$1directory。 | NULL | 
| spark.authenticate | 開啟 Spark 內部連線身分驗證的選項。 | TRUE | 
| spark.driver.cores | 驅動程式使用的核心數量。 | 4 | 
| spark.driver.extraJavaOptions | Spark 驅動程式的額外 Java 選項。 | NULL | 
| spark.driver.memory | 驅動程式使用的記憶體量。 | 14G | 
| spark.dynamicAllocation.enabled | 開啟動態資源配置的選項。此選項會根據工作負載，縱向擴展或縮減向應用程式註冊的執行器數量。 | TRUE | 
| spark.dynamicAllocation.executorIdleTimeout | 在 Spark 移除執行器之前，執行器可以保持閒置的時間長度。這僅適用於您開啟動態配置的情況。 | 60 年代 | 
| spark.dynamicAllocation.initialExecutors | 如果您開啟動態配置，要執行的執行器初始數量。 | 3 | 
| spark.dynamicAllocation.maxExecutors | 如果您開啟動態配置，則執行器數量的上限。 | 對於 6.10.0 和更新版本， `infinity` 對於 6.9.0 及更低版本， `100`  | 
| spark.dynamicAllocation.minExecutors | 如果您開啟動態配置，執行器數量的下限。 | 0 | 
| spark.emr-serverless.allocation.batch.size | 每個執行器配置週期中要請求的容器數量。每個配置週期之間有一秒的間隔。 | 20 | 
| spark.emr-serverless.driver.disk | Spark 驅動程式磁碟。 | 20G | 
| spark.emr-serverless.driverEnv.[KEY] | 將環境變數新增至 Spark 驅動程式的選項。 | NULL | 
| spark.emr-serverless.executor.disk | Spark 執行器磁碟。 | 20G | 
| spark.emr-serverless.memoryOverheadFactor | 設定要新增至驅動程式和執行器容器記憶體的記憶體額外負荷。 | 0.1 | 
| spark.emr-serverless.driver.disk.type | 連接至 Spark 驅動程式的磁碟類型。 | 標準 | 
| spark.emr-serverless.executor.disk.type | 連接至 Spark 執行器的磁碟類型。 | 標準 | 
| spark.executor.cores | 每個執行器使用的核心數量。 | 4 | 
| spark.executor.extraJavaOptions | Spark 執行器的額外 Java 選項。 | NULL | 
| spark.executor.instances | 要配置的 Spark 執行器容器數量。 | 3 | 
| spark.executor.memory | 每個執行器使用的記憶體數量。 | 14G | 
| spark.executorEnv.[KEY] | 將環境變數新增至 Spark 執行器的選項。 | NULL | 
| spark.files | 要放入每個執行器工作目錄中的檔案逗號分隔清單。您可以使用 存取執行器中這些檔案的檔案路徑SparkFiles.get(fileName)。 | NULL | 
| spark.hadoop.hive.metastore.client.factory.class | Hive 中繼存放區實作類別。 | NULL | 
| spark.jars | 要新增至驅動程式和執行器執行時間 classpath 的其他 jar。 | NULL | 
| spark.network.crypto.enabled | 開啟 AES 型 RPC 加密的選項。這包括在 Spark 2.2.0 中新增的身分驗證通訊協定。 | FALSE | 
| spark.sql.warehouse.dir | 受管資料庫和資料表的預設位置。 | 的值 \$1PWD/spark-warehouse | 
| spark.submit.pyFiles | 以逗號分隔的 .zip、 .egg或 .py 檔案清單，以放置在PYTHONPATH適用於 Python 應用程式的 中。 | NULL | 

下表列出預設 Spark 提交參數。


**預設 Spark 提交參數**  

| 金錀 | Description | 預設值 | 
| --- | --- | --- | 
| archives | Spark 擷取到每個執行器工作目錄的以逗號分隔的封存清單。 | NULL | 
| class | 應用程式的主要類別 （適用於 Java 和 Scala 應用程式）。 | NULL | 
| conf | 任意 Spark 組態屬性。 | NULL | 
| driver-cores | 驅動程式使用的核心數量。 | 4 | 
| driver-memory | 驅動程式使用的記憶體量。 | 14G | 
| executor-cores | 每個執行器使用的核心數量。 | 4 | 
| executor-memory | 執行器使用的記憶體數量。 | 14G | 
| files | 以逗號分隔的檔案清單，放置在每個執行器的工作目錄中。您可以使用 存取執行器中這些檔案的檔案路徑SparkFiles.get(fileName)。 | NULL | 
| jars | 要包含在驅動程式和執行器 classpaths 上的逗號分隔 jar 清單。 | NULL | 
| num-executors | 要啟動的執行器數目。 | 3 | 
| py-files | 要放置在PYTHONPATH適用於 Python 應用程式的 上的 .zip、 .egg或 .py 檔案的逗號分隔清單。 | NULL | 
| verbose | 開啟其他偵錯輸出的選項。 | NULL | 

## 資源組態最佳實務
<a name="spark-configuring-driver-executor-resources"></a>

### 透過 StartJobRun API 設定驅動程式和執行器資源
<a name="spark-configuring-driver-executor-resources"></a>

**注意**  
如果指定 Spark 驅動程式和執行器核心和記憶體屬性，則必須在 StartJobRun API 請求中直接指定。

以此方式設定您的資源，可確保 EMR Serverless 可以在執行任務之前配置正確的資源。這與使用者指令碼中提供的設定相反，例如 .py 或 .jar 檔案中的評估太晚，因為驅動程式和執行器工作者有時會在指令碼執行開始之前預先佈建。有兩種支援的方法來在任務提交期間設定這些資源：

#### 選項 1：使用 sparkSubmitParameters
<a name="-spark-option-sparksubmitparameters"></a>

```
"jobDriver": {
 "sparkSubmit": {
    "entryPoint": "s3://your-script-path.py",
    "sparkSubmitParameters": "—conf spark.driver.memory=4g \
    —conf spark.driver.cores=2 \
    —conf spark.executor.memory=8g \
    —conf spark.executor.cores=4"
  }
 }
```

#### 選項 2：使用 configurationOverrides 進行 spark-defaults 分類
<a name="spark-option2configurationoverrides"></a>

```
"configurationOverrides": {
 "applicationConfiguration": [
 {
 "classification": "spark-defaults",
 "properties": {
     "spark.driver.memory": "4g",
     "spark.driver.cores": "2",
     "spark.executor.memory": "8g",
     "spark.executor.cores": "4"
      }
    }
  ]
 }
```

## Spark 範例
<a name="spark-examples"></a>

下列範例示範如何使用 `StartJobRun` API 來執行 Python 指令碼。如需使用此範例的end-to-end教學課程，請參閱 [Amazon EMR Serverless 入門](getting-started.md)。您可以在 [EMR Serverless Samples](https://github.com/aws-samples/emr-serverless-samples/tree/main/examples/pyspark) GitHub 儲存庫中找到有關如何執行 PySpark 任務和新增 Python 相依性的其他範例。

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "s3://us-east-1.elasticmapreduce/emr-containers/samples/wordcount/scripts/wordcount.py",
            "entryPointArguments": ["s3://amzn-s3-demo-destination-bucket/wordcount_output"],
            "sparkSubmitParameters": "--conf spark.executor.cores=1 --conf spark.executor.memory=4g --conf spark.driver.cores=1 --conf spark.driver.memory=4g --conf spark.executor.instances=1"
        }
    }'
```

下列範例示範如何使用 `StartJobRun` API 來執行 Spark JAR。

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "/usr/lib/spark/examples/jars/spark-examples.jar",
            "entryPointArguments": ["1"],
            "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi --conf spark.executor.cores=4 --conf spark.executor.memory=20g --conf spark.driver.cores=4 --conf spark.driver.memory=8g --conf spark.executor.instances=1"
        }
    }'
```