

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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 データカタログへのアクセス

Spark ジョブが他のデータソースとの間でデータを読み書きする場合は、この IAM ロールに適切なアクセス許可を指定します。これらのアクセス許可を IAM ロールに指定しなければ、ジョブが失敗する可能性があります。詳細については、[Amazon EMR Serverless のジョブランタイムロール](security-iam-runtime-role.md) および [ログの保存](logging.md) を参照してください。

### Spark ジョブのドライバーパラメータ
<a name="spark-defaults-jobDriver"></a>

**`jobDriver`** を使用してジョブに入力します。ジョブのドライバーパラメータは、実行するジョブタイプに対して 1 つの値のみを受け入れます。Spark ジョブの場合、パラメータの値は `sparkSubmit` です。このジョブタイプを使用して、Scala、PySpark およびその他のサポートされているジョブを Spark 送信を通じて実行できます。Spark ジョブには、以下のパラメータがあります。
+ **`sparkSubmitParameters`** - これらは、ジョブに送信する追加の Spark パラメータです。このパラメータを使用して、ドライバーメモリや、引数 `--conf` や `--class` で定義されたものなどのエグゼキューターの数など、デフォルトの Spark プロパティを上書きします。
+ **`entryPointArguments`** - これはメイン JAR または Python ファイルに渡す引数の配列です。これらのパラメータの読み取りは、エントリーポイントコードを使用して処理する必要があります。配列の各引数は、カンマで区切ります。
+ **`entryPoint`** – これは、実行するメイン JAR または Python ファイルへの Amazon S3 での参照です。Scala または Java JAR を実行している場合は、`--class` 引数を使用して `SparkSubmitParameters` でメインエントリクラスを指定します。

詳細については、[Launching Applications with spark-submit](https://spark.apache.org/docs/latest/submitting-applications.html#launching-applications-with-spark-submit) を参照してください。

### Spark 設定オーバーライドパラメータ
<a name="spark-defaults-configurationOverrides"></a>

**`configurationOverrides`** を使用して、モニタリングレベルおよびアプリケーションレベルの設定プロパティを上書きします。このパラメータは、次の 2 つのフィールドを持つ 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` を作成するときに指定する設定。
+ `--conf` 引数で `sparkSubmitParameters` の一部として指定する設定。
+ アプリケーションの一部として提供する設定は、ジョブの開始時に上書きされます。
+ アプリケーションの作成時に `runtimeConfiguration` の一部として提供する設定。
+ リリース用に Amazon EMR によって使用された最適化された設定。
+ アプリケーションのデフォルトのオープンソース構成。

アプリケーションレベルでの設定の宣言と、ジョブ実行時の設定の上書きの詳細については、「[EMR Serverless のデフォルトのアプリケーション設定](default-configs.md)」を参照してください。

### Spark 動的リソース割り当ての最適化
<a name="spark-defaults-dynamicResourceAllocation"></a>

EMR Serverless のリソース使用量を最適化するには、`dynamicAllocationOptimization` を使用します。このプロパティを 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)設定を使用して、ワーカーの上限スケーリングを設定することを提案します。
+ 単純なジョブではコスト改善が見られない場合があります。例えば、ジョブが小さなデータセットで実行する場合や、1 つのステージで実行が終了する場合は、Spark は多数のエグゼキュターや複数のスケーリングイベントを必要としないことがあります。
+ 大きなステージ、小さなステージ、そして再び大きなステージのシーケンスを持つジョブでは、ジョブの実行時にリグレッションが発生する可能性があります。EMR Serverless がリソースをより効率的に使用すると、より大きなステージで利用可能なワーカーが少なくなり、ランタイムが長くなる可能性があります。

## Spark ジョブのプロパティ
<a name="spark-defaults"></a>

次の表に、オプションの Spark プロパティと、Spark ジョブを送信するときに上書きできるデフォルト値を示します。


**オプションの Spark プロパティとデフォルト値**  

| キー | 説明 | デフォルトの値 | 
| --- | --- | --- | 
| 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 | エグゼキュター割り当ての各サイクルでリクエストするコンテナの数。各割り当てサイクル間には 1 秒のギャップがあります。 | 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 | ドライバーとエグゼキュターのランタイムクラスパスに追加する追加のジャー。 | NULL | 
| spark.network.crypto.enabled | AES ベースの RPC 暗号化を有効にするオプション。これには、Spark 2.2.0 で追加された認証プロトコルが含まれます。 | FALSE | 
| spark.sql.warehouse.dir | マネージドデータベースとテーブルのデフォルトの場所。 | \$1PWD/spark-warehouse の値 | 
| spark.submit.pyFiles | Python アプリの PYTHONPATH に配置する .zip、.egg、または  .py ファイルのカンマ区切りリスト。 | NULL | 

次の表に、デフォルトの Spark 送信パラメータを示します。


**デフォルトの Spark 送信パラメータ**  

| キー | 説明 | デフォルトの値 | 
| --- | --- | --- | 
| 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 | ドライバーとエグゼキューターのクラスパスに含める jar のカンマ区切りリスト。 | NULL | 
| num-executors | 起動するエグゼキューターの数。 | 3 | 
| py-files | Python アプリの PYTHONPATH に配置する .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 ファイルなど、ユーザースクリプトで提供される設定とは対照的です。これは、ドライバーワーカーとエグゼキュターワーカーがスクリプトの実行を開始する前に事前プロビジョニングされる可能性があるので、評価が遅すぎます。ジョブの送信中にこれらのリソースを設定する方法は 2 つサポートされています:

#### オプション 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: spark-defaults 分類に configurationOverrides を使用する
<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 スクリプトを実行する方法を示しています。この例を使用するエンドツーエンドのチュートリアルについては、「[Amazon EMR Serverless の使用を開始する](getting-started.md)」を参照してください。PySpark ジョブを実行し、Python 依存関係を追加する方法のその他の例は、[EMR Serverless Samples](https://github.com/aws-samples/emr-serverless-samples/tree/main/examples/pyspark) GitHub リポジトリにあります。

```
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"
        }
    }'
```