サービスの利用を最適化する
サービスレベルに関する考慮事項には、アカウントごとに実行するワークロードの数、Athena だけでなくサービス全体でのサービスクォータ、「リソース不足」エラーを減らす方法の検討が含まれます。
同じアカウント内で複数のワークロードを運用する
Athena はクォータを使用して、クエリの同時実行率と API リクエスト率をアカウントレベルで制限します。これらのクォータを超えると、実行中または送信時にクエリが失敗する可能性があります。これらのクォータの詳細については、「Service Quotas」を参照してください。
同じ AWS アカウント内で複数のワークロードを実行している場合、ワークロードは同じアカウントレベルのクォータで競合します。例えば、1 つのワークロードで予期しないクエリのバーストが発生した場合、クエリの送信スロットリングや待機時間の増加が発生する可能性があります。
CloudWatch を使用して、グラフやダッシュボードを使ってサービスの使用状況をモニタリングすることをお勧めします。また、同時クエリのサービスクォータに使用量が近づいたときに警告する CloudWatch アラームを設定して、クォータ制限に達する前にアクションを実行することもできます。詳細については、「CloudWatch による Athena 使用状況メトリクスのモニタリング」を参照してください。
クエリの同時実行を制御し、アカウント内のワークロードを分離するには、キャパシティ予約を使用します。キャパシティ予約は、単一のアカウント内で専用のクエリ処理キャパシティを提供します。キャパシティはデータ処理ユニット (DPU) で測定され、それぞれ追加または削除してクエリの同時実行数を増減できます。キャパシティ予約を使用すると、1 つ以上のワークグループにキャパシティを割り当てることで、アカウント内のワークロードを相互に分離できます。詳細については、「クエリ処理キャパシティを管理する」を参照してください。
ワークロードを異なる AWS アカウントに分離することは、本番環境から開発を分離するなどの組織的な目的に役立ちますが、この方法ではクエリの同時実行性をスケーラブルに向上させることはできません。代わりに、キャパシティ予約を使用して、1 つのアカウント内でクエリ処理の管理とスケーリングが可能になります。
他のサービスのクォータを検討する
Athena がクエリを実行すると、クォータを適用する他のサービスを呼び出せます。クエリの実行中に、Athena は AWS Glue Data Catalog、Amazon S3、および IAM や AWS KMS などその他の AWS サービスなどに API 呼び出しを行えます。フェデレーションクエリを使用する場合、Athena は AWS Lambda に呼び出しも行います。これらのサービスにはすべて、超過できる独自の制限と割り当てがあります。クエリ実行でこれらのサービスからエラーが発生すると、ソースサービスからのエラーも含めて失敗します。復元可能なエラーは再試行されますが、問題が時間内に解決されない場合、クエリが失敗する可能性があります。エラーメッセージをよく読んで、Athena からのものか別のサービスからのものかを判断してください。関連するエラーの一部については、このパフォーマンスチューニングに関するセクションで説明します。
Amazon S3 サービスクォータに起因するエラーの回避方法の詳細については、このドキュメントの後半の「ファイルが多すぎにならないようにする」を参照してください。Amazon S3 のパフォーマンスの最適化の詳細については、「Amazon S3 ユーザーガイド」の「ベストプラクティスの設計パターン: Amazon S3 パフォーマンスの最適化」を参照してください。
「リソース不足」エラーを減らす
Athena は分散クエリエンジンでクエリを実行します。クエリを送信すると、Athena エンジンのクエリプランナーはクエリを実行するのに必要な計算能力を見積もり、それに応じて計算ノードのクラスターを準備します。DDL クエリなどの一部のクエリは、1 つのノードでのみ実行されます。大規模なデータセットに対する複雑なクエリでは、はるかに大きなクラスターで実行されます。ノードは均一であり、メモリ、CPU、およびディスク構成は同じです。Athena は、より要求の厳しいクエリを処理するためにスケールアップするのではなく、スケールアウトします。
クエリの要求は、クエリを実行するクラスターで使用可能なリソースを超えることがあります。この場合にはクエリは失敗し、「このスケールファクターでリソースを使い果たしました」というエラーが表示されます。
最も一般的に消費されるリソースはメモリですが、まれにディスク容量になる場合もあります。メモリエラーは通常、エンジンが結合またはウィンドウ関数を実行するときに発生しますが、カウントや集計が異なる場合もあります。
クエリが「リソース不足」エラーで一度失敗した場合でも、もう一度実行すると成功する可能性があります。クエリの実行は確定的ではありません。データの読み込みにかかる時間や中間データセットがノードにどのように分散されるかなどの要因により、リソースの使用量が異なる場合があります。たとえば、2 つのテーブルを結合するクエリで、結合条件の値の分布に大きな偏りがあるとします。このようなクエリはほぼ成功しますが、最も一般的な値が同じノードで処理されてしまうと失敗することがあります。
クエリが利用可能なリソースを超えないようにするには、このドキュメントに記載されているパフォーマンスチューニングのヒントを参考にしてください。特に、使用可能なリソースを使い果たすクエリを最適化する方法のヒントについては、「結合を最適化する」、「ウィンドウ関数の範囲を縮小したり、削除したりする」、および「近似値を使用してクエリを最適化する」を参照してください