

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

![Spark Map Stage でデータがディスクに書き込まれ、シャッフル処理されて S3 に転送され、その後、Spark Reduce Stage で S3 から読み取られます。](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/gs-s3-shuffle-diagram.png)


大きなシャッフルオペレーションのためにローカルディスク容量の制約を受けることがわかっている場合、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 シャッフルを有効にします。

![write-shuffle-files キー、オプションの値フィールド、[削除] ボタンが表示されているジョブパラメータセクション。](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 シャッフルマネージャーが有効になり、チューニングされます。これらのパラメータはフラグなので、指定された値は考慮されません。

**重要**  
Amazon S3 シャッフルを無効にするには、`--write-shuffle-files-to-s3` パラメータをジョブ設定から完全に削除する必要があります。値を `false` に設定しても Amazon S3 シャッフルは無効になりません。パラメータはプレゼンスベースのフラグとして機能するので、パラメータが存在する場合、Amazon S3 シャッフルは任意の値 (`false` など) で有効化されます。
+ `--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) の手順に従ってください。
+ データに偏りがある場合、この機能が使用できます。