DEA / ドメイン3 データ運用とサポート
重要な内容
Amazon Athena
は、 に置いたデータに、サーバーを用意せずに で問い合わせられるのクエリサービスです。テーブルの定義 (列の名前と型、データの場所) は Data Catalog から読み、データ本体は S3 から直接読みます。料金は主にクエリがスキャンしたデータ量で決まります。
DEA では、Data Catalog を使ったクエリ、 と INSERT INTO による変換、ビュー、ワークグループによるコストの管理、クエリ結果の再利用、、 対応のノートブックによるデータの探索が問われます。
Point
- Athena はギリシャ神話の知恵の女神アテナの名前です。
- CTAS = CREATE TABLE AS SELECT の略で、SELECT の結果から新しいテーブルを作る SQL です。
- Workgroup = 作業グループ で、クエリの実行設定とコストの上限をまとめる単位です。
概要
は、データを動かさずに の上で を実行します。
| 用途 | 内容 |
|---|---|
| アドホックな分析 | S3 のに、その場で SQL を投げます。 |
| データの変換 | や INSERT INTO で、CSV を に変換したり、集計済みのテーブルを作ったりします。 |
| ログの分析 | 、 フローログ、S3 アクセスログ、 のログを SQL で調べます (#65)。 |
| からの参照 | などから Athena を経由して S3 のデータを可視化します。 |
試験では、「サーバーの管理なしに S3 のデータを SQL で分析したい」「たまにしか実行しない」「スキャン量でコストを抑えたい」という条件で Athena を選びます。
主要技術
①Data Catalog を使った SQL ⚠️ 頻出
はテーブルの定義を Data Catalog から読みます。テーブルは で自動作成するか、Athena の CREATE EXTERNAL TABLE で作ります。
パーティション (例: year=2026/month=10/day=17/ のような のプレフィックス) を定義すると、WHERE 句で指定したパーティションだけを読むため、スキャン量と時間が減ります。新しいパーティションの登録には次の方法があります。
| 方法 | 動き | 向く場面 |
|---|---|---|
MSCK REPAIR TABLE | S3 を調べて Hive 形式のパーティションを一括で追加します | 時々まとめて追加するとき。パーティションが多いと遅くなります。 |
ALTER TABLE ADD PARTITION | 指定したパーティションを追加します | 取り込みのたびに追加するとき |
| Glue クローラー | スケジュールで S3 を調べて追加します | スキーマの変化も拾いたいとき |
| (partition projection) | テーブルの設定からパーティションの値を計算し、カタログへの登録自体を不要にします | 日付などの規則的なパーティションが非常に多いとき |
⚠️ 頻出: 「日付のパーティションが大量にあり、カタログへの登録とクエリの計画に時間がかかる」はパーティション射影です。
②CTAS、INSERT INTO、ビュー
| 用途 | ポイント | |
|---|---|---|
| SELECT の結果から新しいテーブルを作ります | 出力の形式 (、 など)、圧縮、パーティション、を指定できます。CSV から Parquet への変換に使えます。 | |
| INSERT INTO | 既存のテーブルに SELECT の結果を追加します | 日次で新しいパーティションを追加する に使えます。 |
| SELECT の結果を、指定した形式で に書き出します | テーブルを作らずに、結果を Parquet などで出力します。 | |
| CREATE VIEW | SELECT を名前付きで保存した論理的なビューです | 結果は保存されず、参照のたびにクエリが実行されます。複雑な結合を隠して、利用者に簡単な名前で見せます。 |
のビュー (Athena ビュー) は、参照する利用者が元のテーブルへの権限を持っている必要があります。Athena と など複数のエンジンで同じビューを共有したい場合は、定義を Data Catalog に保存する Data Catalog ビューを使います。Data Catalog ビューは作成者の権限で評価される (definer の方式) ため、利用者に元のテーブルへの権限を与えずにビューだけを読ませられ、ビューへの権限は で付与します。
CTAS と INSERT INTO で1回に作れる (書き込める) パーティションは 100 までです。それを超える場合は、CTAS で 100 以内を作り、残りを INSERT INTO で 100 ずつ追加します。
のテーブルでは、Athena から UPDATE、DELETE、 も実行でき、行単位の更新や upsert ができます。
③ワークグループとコストの管理 ⚠️ 頻出
ワークグループは、チームや用途ごとにクエリを分ける単位です。
| 設定 | 内容 |
|---|---|
| クエリ結果の場所と暗号化 | ワークグループの全員の結果を、決めた の場所に、決めた暗号化で保存させます。 |
| クエリごとのデータ使用量の上限 | 1つのクエリのスキャン量が上限を超えたら、そのクエリをキャンセルします (最小 10 MB)。 |
| ワークグループ全体のデータ使用量のアラート | 1時間や1日などの期間の合計スキャン量がしきい値を超えたら、 のと で通知します。クエリは自動ではキャンセルされません。 |
| CloudWatch へのの送信 | ワークグループごとのクエリの件数、スキャン量、実行時間を見られます。 |
| による利用者の制御 | ワークグループ単位で、誰が使えるかを制御します。 |
コストを下げる基本は、スキャン量を減らすことです。列指向の形式 (、)、圧縮、パーティション、必要な列だけを SELECT する書き方を組み合わせます。
⚠️ 頻出: 「1つのクエリが大量のデータをスキャンするのを防ぎたい」はクエリごとの上限、「チームの合計の使用量を見張って通知したい」はワークグループ全体のアラートです。
④クエリ結果の再利用
同じクエリを繰り返し実行する場合、クエリ結果の再利用を有効にすると、指定した最大経過時間 (既定 60 分、最大 7 日) 以内の前回の結果を返し、スキャンを省けます。同じワークグループの中でだけ再利用されます。
ただし、元のデータが変わっても最大経過時間までは古い結果が返ります。また、 の細かいアクセス制御 (行や列のフィルター) が付いたテーブルや、では再利用されません。
⑤フェデレーテッドクエリ
は、 以外のデータソース (、、、、のデータベースなど) に、 で動くデータソースコネクタを通して を実行する機能です。S3 のデータとほかのデータベースのデータを、データを移さずに1つの SQL で結合できます。
| 選択肢 | 向く場面 |
|---|---|
| のフェデレーテッドクエリ | たまに、複数のデータソースをまたいで調べたい |
| で S3 にまとめる | 頻繁に大量のデータを結合して分析する |
| Redshift のフェデレーテッドクエリ | Redshift の中から RDS / Aurora の最新データを参照したい |
⑥Apache Spark 対応の Athena ノートブック
では のほかに、 でデータを探索できます。で、Spark の環境を用意せずに PySpark のコードを実行でき、必要な計算資源は自動で増減します。
| 実行の形 | 内容 |
|---|---|
| Athena コンソールのノートブック | Jupyter 互換のノートブックで、セルごとに Python (PySpark) を実行します (PySpark エンジンのバージョン 3)。 |
| Unified Studio のノートブック | Apache Spark 3.5 のリリースでは、SageMaker Unified Studio のノートブックや Spark Connect に対応したクライアントから実行します。 |
Spark 用のワークグループを作り、セッションの中で計算 (calculation) を実行します。SQL では書きにくい複雑な変換や、Python のライブラリを使った探索に向きます。料金は、SQL のクエリのようなスキャン量ではなく、セッションで使った (Data Processing Unit) の時間で決まります。
⑦その他の性能とコストの選択肢
| 機能 | 内容 |
|---|---|
| プロビジョンドキャパシティ (容量予約) | の単位で専用の処理能力を確保し、スキャン量ではなく確保した DPU の時間で課金します。割り当てたワークグループのクエリだけがその容量で動き、アカウントの DDL・DML ののに数えられないため、重要なクエリをほかの負荷から切り離せます。 の変更は不要です。 用のワークグループには使えません。 |
| / ODBC ドライバー | ツールやアプリケーションから に接続します。 |
| Athena の | StartQueryExecution で非同期に実行し、GetQueryExecution で状態を確かめ、GetQueryResults で結果をページングで取得します (#61)。 |
試験対策
①判断マトリクス
| 問題文のキーワード | 選ぶ機能 | 理由 |
|---|---|---|
| で のデータに 、アドホックな分析 | サーバー管理なし、スキャン量の課金です。 | |
| CSV を に変換し、パーティションも付けたい | (形式とパーティションを指定) | SQL だけで変換できます。 |
| 日次で新しいデータをテーブルに追加 | INSERT INTO | 既存テーブルへ追加します。 |
| 100 を超えるパーティションを一度に作りたい | CTAS + INSERT INTO の繰り返し | 1回の上限は 100 です。 |
| 複雑な結合を利用者に簡単な名前で見せたい | ビュー | SELECT を名前付きで保存します。 |
| 1つのクエリのスキャン量を制限 | ワークグループのクエリごとの上限 | 超えたクエリをキャンセルします。 |
| チームの合計スキャン量を監視して通知 | ワークグループ全体のアラート + | しきい値で通知します。 |
| 同じクエリの繰り返しでコストを減らす | クエリ結果の再利用 | 前回の結果を返します。 |
| S3 と / をまたいで SQL | のコネクタで接続します。 | |
| 日付パーティションが非常に多い | カタログへの登録が不要になります。 | |
| でデータを探索、サーバーレス | Athena の Apache Spark 対応ノートブック | Spark の環境を用意せずに使えます。 |
②よくある誤答
- のビューに結果が保存されると考えること。ビューは論理的な定義で、毎回クエリが実行されます。事前に集計した結果を保存するなら です。
- スキャン量を減らすのに LIMIT を付けること。LIMIT は返す行を減らすだけで、読み込む量が減るとは限りません。パーティション、列指向の形式、列の絞り込みで減らします。
- クエリごとの上限とワークグループ全体のアラートを混同すること。キャンセルするのはクエリごとの上限です。