

# Spark のシャッフルデータの保存
<a name="monitor-spark-shuffle-manager"></a>

シャッフルは、データがパーティション間で再配置されるたびに行われる Spark ジョブの重要なステップです。これが必要なのは、`join`、` groupByKey`、`reduceByKey`、`repartition` などのさまざまな変換に、処理を完了するために他のパーティションからの情報が必要なためです。Spark は各パーティションから必要なデータを収集し、新しいパーティションに結合します。シャッフル中、データはディスクに書き込まれ、ネットワーク経由で転送されます。その結果、シャッフルオペレーションはローカルディスク容量に制約されます。Spark の `No space left on device` または ` MetadataFetchFailedException` エラーは、エグゼキュターに十分なディスク領域がなく、リカバリがない場合に発生します。

**注記**  
 Amazon S3 での AWS Glue Spark シャッフルプラグインは、AWS Glue ETL ジョブについてのみサポートされています。

**ソリューション**  
AWS Glue では、Amazon S3 を使用して Spark シャッフルデータを保存できるようになりました。Amazon S3 は、業界をリードするスケーラビリティ、データ可用性、セキュリティ、およびパフォーマンスを提供するオブジェクトストレージサービスです。このソリューションで、Spark ジョブ用のコンピューティングとストレージが非集約化され、完全な伸縮自在性と低コストのシャッフルストレージが得られ、シャッフル負荷の高いワークロードが高い信頼性で実行できるようになります。

![\[Spark workflow showing Map and Reduce stages using Amazon S3 for shuffle data storage.\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/gs-s3-shuffle-diagram.png)


Amazon S3 を使用するための Cloud Shuffle Storage Plugin for Apache Spark を導入します。大きなシャッフルオペレーションのためにローカルディスク容量の制約を受けることがわかっている場合、Amazon S3 シャッフルを有効にすると、AWS Glue ジョブを失敗することなく高い信頼性で実行できます。小さなパーティションが多数ある場合や、Amazon S3 に書き込まれたファイルをシャッフルする場合、Amazon S3 へのシャッフルはローカルディスク (または EBS) よりもわずかに遅くなる場合があります。

## クラウドシャッフルストレージプラグインを使用するための前提条件
<a name="monitor-spark-shuffle-manager-prereqs"></a>

 AWS Glue ETL ジョブにクラウドシャッフルストレージプラグインを使用するには、以下が必要です。
+ 途中のシャッフルデータやスピルしたデータを保存するための、ジョブが実行されているのと同じリージョンにある Amazon S3 バケット。シャッフルストレージの Amazon S3 プレフィックスは、`--conf spark.shuffle.glue.s3ShuffleBucket=s3://shuffle-bucket/prefix/` で次の例のように指定できます。

  ```
  --conf spark.shuffle.glue.s3ShuffleBucket=s3://glue-shuffle-123456789-us-east-1/glue-shuffle-data/
  ```
+  シャッフルマネージャーはジョブの終了後にファイルをクリーンアップしないため、プレフィックス (`glue-shuffle-data` など) に Amazon S3 ストレージライフサイクルポリシーを設定します。途中のシャッフルデータやスピルしたデータは、ジョブの終了後に削除する必要があります。ユーザーはプレフィックスに短いライフサイクルポリシーを設定できます。Amazon S3 ライフサイクルポリシーのセットアップ手順については、「Amazon Simple Storage Service ユーザーガイド」の「[バケットのライフサイクル設定の指定](https://docs.aws.amazon.com//AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)」を参照してください。

## AWS コンソールからの AWS Glue Spark シャッフルマネージャーの使用
<a name="monitor-spark-shuffle-manager-using-console"></a>

ジョブを設定するときに AWS Glue コンソールまたは AWS Glue Studio を使用して AWS Glue Spark シャッフルマネージャーをセットアップするには、**--write-shuffle-files-to-s3** ジョブパラメータを選択して、ジョブの Amazon S3 シャッフルを有効にします。

![\[Job parameters interface showing --write-shuffle-files- parameter and option to add more.\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/gs-s3-shuffle.png)


## AWS Glue Spark シャッフルプラグインの使用
<a name="monitor-spark-shuffle-manager-using"></a>

次のジョブパラメータで、AWS Glue シャッフルマネージャーが有効になり、チューニングされます。これらのパラメータはフラグなので、指定された値は考慮されません。
+ `--write-shuffle-files-to-s3` – メインフラグです。Amazon S3 バケットを使用してシャッフルデータの書き込みと読み込みを行う AWS Glue Spark シャッフルマネージャーが有効になります。フラグを指定しない場合、シャッフルマネージャーは使用されません。
+ `--write-shuffle-spills-to-s3` – (AWS Glue バージョン 2.0 でのみサポートされています)。オプションのフラグです。スピルファイルを Amazon S3 バケットにオフロードできます。これにより、Spark ジョブの耐障害性が強化されます。これは、大量のデータをディスクに退避させる大規模なワークロードにのみ必要です。フラグが指定されていない場合、中間スピルファイルは書き込まれません。
+ ` --conf spark.shuffle.glue.s3ShuffleBucket=s3://<shuffle-bucket>` – 別のオプションのフラグです。シャッフルファイルを書き込む Amazon S3 バケットを指定します。デフォルトでは、`--TempDir`/shuffle data です。AWS Glue 3.0 以降では、`--conf spark.shuffle.glue.s3ShuffleBucket=s3://shuffle-bucket-1/prefix,s3://shuffle-bucket-2/prefix/` のようにバケットをカンマ区切りで指定することで、シャッフルファイルを複数のバケットに書き込むことができます。複数のバケットを使用するとパフォーマンスが向上します。

シャッフルデータの保存時の暗号化を有効にするには、セキュリティ構成設定を提供する必要があります。　 セキュリティの構成の詳細については、「[AWS Glue での暗号化のセットアップ](set-up-encryption.md)」を参照してください。AWS Glue は、Spark が提供する他のすべてのシャッフル関連の構成をサポートします。

**クラウドシャッフルストレージプラグインのソフトウェアバイナリ**  
また、Apache 2.0 ライセンスで Cloud Shuffle Storage Plugin for Apache Spark のソフトウェアバイナリをダウンロードして、任意の Spark 環境で実行することもできます。新しいプラグインは Amazon S3 をそのまま使えるようにサポートしており、[Google クラウドストレージや Microsoft Azure Blob ストレージ](https://github.com/aws-samples/aws-glue-samples/blob/master/docs/cloud-shuffle-plugin/README.md)などの他の形式のクラウドストレージを使用するように簡単に設定することもできます。詳細については、「[Cloud Shuffle Storage Plugin for Apache Spark](https://docs.aws.amazon.com/glue/latest/dg/cloud-shuffle-storage-plugin.html)」を参照してください。

**注意事項と制限事項**  
AWS Glue シャッフルマネージャーには次の注意事項や制限事項があります。
+  AWS Glue シャッフルマネージャーは、ジョブの完了後に Amazon S3 バケットに保存されている (一時的な) シャッフルデータファイルを自動的に削除しません。データを確実に保護するには、Cloud Shuffle ストレージプラグインを有効にする前に、[クラウドシャッフルストレージプラグインを使用するための前提条件](#monitor-spark-shuffle-manager-prereqs) の手順に従ってください。
+ データに偏りがある場合、この機能が使用できます。

# Cloud Shuffle Storage Plugin for Apache Spark
<a name="cloud-shuffle-storage-plugin"></a>

Cloud Shuffle ストレージプラグインは [`ShuffleDataIO` API](https://github.com/apache/spark/blob/master/core/src/main/java/org/apache/spark/shuffle/api/ShuffleDataIO.java) と互換性のある Apache Spark プラグインで、シャッフルデータをクラウドストレージシステム (Amazon S3 など) に保存することを可能にします。この機能では、Spark アプリケーションにおいて `join`、`reduceByKey`、`groupByKey`、および `repartition` などの変換によってトリガーされることが多い、大規模なシャッフル操作用のローカルディスクストレージ容量を補充または置換できます。このため、サーバーレスデータ分析ジョブやパイプラインでの、一般的な障害やコスト対パフォーマンスの不整合を軽減するのに役立ちます。

**AWS Glue**  
AWS Glue バージョン 3.0 と 4.0 には、このプラグインが事前インストールされており、特別な手順なしで Amazon S3 でシャッフルが利用可能になります。Spark アプリケーションでこの機能を有効にする方法については、「[AWS Glue シャッフルマネージャーと Amazon S3](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-shuffle-manager.html) 」を参照してください。

**その他の Spark 環境**  
他の Spark 環境では、このプラグインに以下の Spark 構成を設定する必要があります。
+ `--conf spark.shuffle.sort.io.plugin.class=com.amazonaws.spark.shuffle.io.cloud.ChopperPlugin`: こSpark に対し、Shuffle IO 用としてこのプラグインを使用することを通知します。
+ `--conf spark.shuffle.storage.path=s3://bucket-name/shuffle-file-dir`: シャッフルファイルが保存されるパスです。

**注記**  
このプラグインは、Spark コアクラスの 1 つを上書きします。そのため、プラグインの jar ファイルは、Spark jar に先行してロードする必要があります。プラグインを AWS Glue の外部で使用する場合は、オンプレミスの YARN 環境で `userClassPathFirst` を使用して、この処理を実行できます。

## Spark アプリケーションへのプラグインのバンドル
<a name="cloud-shuffle-storage-plugin-bundling"></a>

Spark アプリケーションをローカルで開発する際、Maven `pom.xml` にプラグインの依存関係を追加することで、Spark アプリケーションと Spark ディストリビューション (バージョン 3.1 以降) にプラグインをバンドルできます。このプラグインと Spark バージョンの詳細については、「[プラグインのバージョン](#cloud-shuffle-storage-plugin-versions)」を参照してください。

```
<repositories>
   ...
    <repository>
        <id>aws-glue-etl-artifacts</id>
        <url>https://aws-glue-etl-artifacts.s3.amazonaws.com/release/ </url>
    </repository>
</repositories>
...
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>chopper-plugin</artifactId>
    <version>3.1-amzn-LATEST</version>
</dependency>
```

別の方法として、以下のように AWS Glue Maven アーティファクトからバイナリを直接ダウンロードして、Spark アプリケーションにインクルードすることも可能です。

```
#!/bin/bash
sudo wget -v https://aws-glue-etl-artifacts.s3.amazonaws.com/release/com/amazonaws/chopper-plugin/3.1-amzn-LATEST/chopper-plugin-3.1-amzn-LATEST.jar -P /usr/lib/spark/jars/
```

spark-submit の例

```
spark-submit --deploy-mode cluster \
--conf spark.shuffle.storage.s3.path=s3://<ShuffleBucket>/<shuffle-dir> \
--conf spark.driver.extraClassPath=<Path to plugin jar> \ 
--conf spark.executor.extraClassPath=<Path to plugin jar> \
--class <your test class name> s3://<ShuffleBucket>/<Your application jar> \
```

## オプションの設定
<a name="cloud-shuffle-storage-plugin-optional"></a>

これらは Amazon S3 シャッフルの動作を制御するための、オプションの設定値です。
+ `spark.shuffle.storage.s3.enableServerSideEncryption`: ファイルのシャッフルおよびスピルのために、S3 SSE を有効化/無効化します。デフォルト値は `true` です。
+ `spark.shuffle.storage.s3.serverSideEncryption.algorithm`: 使用される SSE アルゴリズム。デフォルト値は `AES256` です。
+ `spark.shuffle.storage.s3.serverSideEncryption.kms.key`: aws:kms が有効になっている場合の KMS キーの ARN。

これらの構成に加え、ユースケースに応じて適切な暗号化が適用されるように `spark.hadoop.fs.s3.enableServerSideEncryption`、**その他の環境固有の構成**などの設定が必要になる場合があります。

## プラグインのバージョン
<a name="cloud-shuffle-storage-plugin-versions"></a>

このプラグインは、AWS Glue のバージョンごとに関連付けられている Spark バージョンで、それぞれサポートされています。次の表に、AWS Glue のバージョン、Spark バージョン、およびプラグインのソフトウェアバイナリ用の Amazon S3 ロケーションと関連付けたプラグインバージョンを示します。


| AWS Glue バージョン | Spark バージョン | プラグインバージョン | Amazon S3 ロケーション | 
| --- | --- | --- | --- | 
| 3.0 | 3.1 | 3.1-amzn-LATEST |  s3://aws-glue-etl-artifacts/release/com/amazonaws/chopper-plugin/3.1-amzn-0/chopper-plugin-3.1-amzn-LATEST.jar  | 
| 4.0 | 3.3 | 3.3-amzn-LATEST |  s3://aws-glue-etl-artifacts/release/com/amazonaws/chopper-plugin/3.3-amzn-0/chopper-plugin-3.3-amzn-LATEST.jar  | 

## ライセンス
<a name="cloud-shuffle-storage-plugin-binary-license"></a>

このプラグインのソフトウェアバイナリは、Apache-2.0 License の下でライセンスされています。