Amazon EMR での Apache Spark または Apache Hive のジョブが HTTP 503 "Slow Down" の Amazons3Exception で失敗します。
簡単な説明
アプリケーションに対する Amazon Simple Storage Service (Amazon S3) のリクエストレートが通常の持続レートを超え、Amazon S3 が内部でパフォーマンスを最適化した場合に、以下のエラーが発生します。
"java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Slow Down (Service: Amazon S3; Status Code: 503; Error Code: 503 Slow Down; Request ID: 2E8B8866BFF00645; S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE=), S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE="
解決策
CloudWatch リクエストメトリクスを設定する
リクエスト過多の問題を特定するには、Amazon S3 バケットに Amazon CloudWatch リクエストメトリクスを設定することがベストプラクティスです。
バケットの CloudWatch リクエストメトリクスを有効にし、プレフィックス用のフィルターを定義します。
Amazon S3 リクエストの再試行方法を変更する
デフォルトでは、EMR File System (EMRFS) はエクスポネンシャルバックオフ方法を使用して Amazon S3 へのリクエストを再試行します。EMRFS のデフォルトの再試行制限は 15 回ですが、新しいクラスター、実行中のクラスター、またはアプリケーションの実行時の再試行制限を増やすことができます。
再試行の制限を増やすには、fs.s3.maxRetries パラメータの値を変更します。
**注:**このパラメータに非常に高い値を設定すると、ジョブの所要時間が長くなる可能性があります。
パラメータを高い値 (たとえば 20) に設定し、ジョブの持続時間のオーバーヘッドをモニタリングします。次に、ユースケースに基づいてパラメータを調整します。
新しいクラスターでは、クラスターの起動時に次のような構成オブジェクトを追加します。
[
{
"Classification": "emrfs-site",
"Properties": {
"fs.s3.maxRetries": "20"
}
}
]
クラスターを起動すると、Amazon EMR で実行される Spark および Hive アプリケーションは新しい制限を使用します。
実行中のクラスターの再試行制限を増やすには、次の手順を実行します。
- Amazon EMR コンソールを開きます。
- 再構成するアクティブなクラスターを選択します。
- [設定] タブを選択します。
- [フィルター] ドロップダウンリストで、再設定するインスタンスグループを選択します。
- [再構成] のドロップダウンリストで [テーブルで編集] を選択します。
- 構成分類テーブルで [設定を追加] を選択し、次の内容を入力します。
[分類] には emrfs-site を使用します
[プロパティ] には ffs.s3.maxRetries を使用します
[値] には、再試行制限に新しい値を使用します。例: 20。
- [この設定をすべてのアクティブなインスタンスグループに適用] を選択します。
- [変更を保存] を選択します。
構成のデプロイ後、Spark および Hive アプリケーションは新しい制限を使用します。
Spark アプリケーションの実行時の再試行制限を増やすには、Spark シェルセッションを使用して fs.s3.maxRetries パラメータを次の例のように変更します。
spark> sc.hadoopConfiguration.set("fs.s3.maxRetries", "20")
spark> val source_df = spark.read.csv("s3://awsexamplebucket/data/")
spark> source_df.write.save("s3://awsexamplebucket2/output/")
Hive アプリケーションの実行時の再試行制限を増やすには、次の例のようなコマンドを実行します。
hive> set fs.s3.maxRetries=20;
hive> select ....
同時に実行する S3 リクエストの数を調整する
- 同じ S3 プレフィックスへの読み取りと書き込みを行う複数のジョブ (Spark、Apache Hive、または s-dist-cp) がある場合は、同時実行を調整します。読み取りや書き込みの負荷が最も高いジョブから始め、並列処理が過剰にならないように並行処理を下げます。
**注:**Amazon S3 のクロスアカウントアクセスを設定した場合、他の AWS アカウントも同じプレフィックスでジョブを送信する可能性があります。
- ジョブが宛先バケットに書き込もうとしたときにエラーが発生した場合は、過剰な書き込み並列処理を減らしてください。たとえば、Amazon S3 に書き込む前に、Spark の .coalesce または .repartition() 操作を実行することで、Amazon S3 への書き込み前の Spark の出力パーティション数を減らすことができます。エグゼキューターあたりのコア数を減らすか、エグゼキューターの数を減らすことも有効です。
- ジョブがソースバケットからの読み込みを試行してエラーが発生した場合は、オブジェクトのサイズを調整します。ジョブで読み込まれるオブジェクトの数を減らすには、小さいオブジェクトを大きいオブジェクトに集約します。たとえば、s3-dist-cp を使用すると、多数の小さなファイルを少数の大きなファイルにマージできます。
関連情報
設計パターンのベストプラクティス: Amazon S3 のパフォーマンスを最適化する
Amazon EMR アプリケーションがエラーとなり、HTTP 403 "Access Denied" AmazonS3Exception が発生する理由を知りたいです
Amazon EMR アプリケーションがエラーとなり、HTTP 404 "Not Found" AmazonS3Exception が発生する理由を知りたいです