ある企業が、Amazon S3 に保存された数 PB のデータに対してアドホックな SQL クエリを実行するデータレイクを構築したい。クエリのコストを最小限に抑えながら、パフォーマンスを向上させるためのベストプラクティスを 2 つ選択してください。
- A. S3 のデータをデータの属性(日付・地域等)でパーティション分割して保存し、Athena クエリで WHERE 句にパーティションキーを指定してスキャン量を削減する。
- B. すべてのデータを CSV 形式で保存し、Amazon Athena で全列クエリを実行する。
- C. S3 のデータを Apache Parquet または ORC などの列指向フォーマットで保存し、クエリが必要な列のみを読み取れるようにする。
- D. Amazon Redshift にすべてのデータをロードし、すべての SQL クエリを Redshift で実行する。
- E. Athena クエリのすべての結果を EC2 インスタンスのメモリにキャッシュする。
解答と解説を見る
正解: A, C
Athena は S3 上のデータをスキャンした量に応じて課金される(1TB あたり約 5USD)ため、スキャン量の削減がコストとパフォーマンスの両方に直結する。選択肢Cの列指向フォーマット(Parquet/ORC)では SELECT する列のみを読み取れるため、全列 CSV より大幅にスキャン量が削減でき、クエリ速度も向上する(圧縮効率も高い)。選択肢AのS3 パーティション分割(Hive スタイルのプレフィックス: s3://bucket/year=2024/month=01/...)により、Athena がクエリの WHERE 句でパーティションプルーニングを実行し、関係のないパーティションのデータをスキャンしない。数 PB のデータでも WHERE year=2024 AND month=01 なら該当月のデータのみを処理できる。選択肢Bの CSV 全列クエリはスキャン量が最大になり、コスト・パフォーマンスとも最悪。選択肢EのEC2 キャッシュはアドホッククエリには効果がなく、インフラ管理も必要になる。選択肢DのRedshift への全量ロードはロードコスト・時間・Redshift クラスターの常時稼働コストが発生し、「コスト最小限」の要件に合わない。
📚 関連サービスの解説: Amazon S3 ・ Amazon Athena