8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS Athena を使い始める前の基礎理解

Last updated at Posted at 2020-02-22

はじめに

Amazon Athena を利用する前に理解すべき基礎について、【AWS Black Belt Online Seminar】Amazon Athena - YouTube を参考にまとめました。

Amazon Athena とは

S3 上のデータに対して、標準SQL によるインタラクティブなクエリを投げてデータ分析をできるサービス。特徴については下記参照。

  • サーバレスでインフラ管理必要無し
  • 大規模データに対しても高速なクエリ
  • 事前のデータロードなしに S3 に直接クエリ
  • スキャンしたデータに対しての従量課金
  • JDBC / ODBC / API 経由で BIツールやシステムと連携
    • ODBC : RDBMS にアクセスするための共通インタフェース
    • JDBC : Java と関係データベースの接続のためのAPI

ユースケース

  • 新しく取得したデータに対して、データウェアハウスに入れる価値があるか探索的に検証
    • データウェアハウス(ex. Redshift)は管理コストがかかる
  • 利用頻度の低い過去のデータに対する BI ツール経由のアドホックな分析
    • データウェアハウスだとストレージコストがかかるため
  • Webサーバのログを S3 に保存しておくことで、障害発生時に SQL で原因追求できる
    • UNIX コマンドで調査が不要になる
  • 程頻度実施のETLツール

Amazon Athena のアーキテクチャ

クエリエンジン

  • Presto を利用
    • データをディスクに書き出さず、全てメモリ上で処理
    • ノード故障やメモリ溢れが起きたらクエリ自体が失敗する
    • バッチ処理ではなく、インタラクティブクエリ向け

参考:Prestoとは何か,Prestoで何ができるか

メタデータの管理

  • AWS Glue
    • Data Catalog でメタデータを管理する
    • メタデータとは、DB / Table / View / Partition

Amazon Athena 基本

テーブル定義

image.png

  • 標準のテーブル定義の後に、データ形式、圧縮形式、データの場所などを指定
  • Glue で S3 データに対して Crawler を投げてテーブル登録することも可能
  • スキーマオンリードなので、同一のデータに複数のスキーマを定義可能
    • スキーマとはデータベースの設計図のようなもの

参考:スキーマ (データベース) - wikipedia

利用できるデータ型

image.png

データ形式

image.png

データの圧縮形式

GZIP はあまり効率的ではない。
image.png

対応クエリ

  • Presto と同様、標準 ANSI (米国規格協会) SQL に準拠したクエリ
    • WITH, Window関数, JOIN などに対応

SQLの標準規格は、ANSI(米国規格協会)やISO(国際標準化機構)といった標準化団体により、数年に一度改訂されます。

改訂ごとに決められた規格は、制定された年ごとに「SQL:1999」「SQL:2003:「SQL:2003」「SQL:2008」「SQL:2011」「SQL:2016」などと呼ばれます。こうした標準規格に準拠したSQLが標準SQLです

ただし、SQLの標準規格に「すべてのRDBMSは標準SQLを使わなければならない」という強制力はありません。標準SQLをサポートしたRDBMSは増えましたが、それでも標準SQLで書いたSQL文を実行できないことがあります。

参考:標準SQLとは - 標準SQL徹底入門

DDL / クエリの注意点

  • DDL(Data Definition Language) とはデータ定義言語のこと
    • SQL でいうと CREATEDROP ALTERTRUNCATE
  • DDLでは、EXTERNAL TABLE のみ利用可能
  • データは常に S3 にあり、Athena サービス外のため
  • VIEW、CTAS にも対応
  • 以下の処理には未対応
    • トランザクション処理
    • UDF / UDAF
    • ストアドプロシージャ

Athena API

  • Athena はSQL クライアントからだけでなく、プログラムから API を呼び出すことができる
  • API は大きく2種類
    • Query Execution API
      • クエリを実行することに関する API
    • Named Query API
      • クエリの保存機能に対する API

Amazon Athena の特性

  • OLTP(Online Transactional Processiong) ではなく、OLAP(Online Analytical Processing)向け
    • そもそもトランザクションは未サポート
  • ETL ではなく分析向け
    • データをフルスキャン&変換するのは高コストな設計
    • リトライ機構がないので、安定的なバッチ処理には向かない
  • いかにして読み込むデータ量を減らすかが重要
    • パーティション
    • 列指向フォーマット
    • 圧縮

スキャン量の減らし方

Athena の特性において、コスト削減のためにはいかにしてS3から読み込むデータ量を減らすかが重要。減らし方については下記。

パーティション

  • S3 のオブジェクトキーの構成を CREATE TABLE に反映

    • 例:S3://athena-examples/action-logs/year=2020/month=02/day=21/data_01.gz のように保存されている場合、下記のように DDL を発行し、クエリを実行すると WHERE 句で絞ったS3 パスのみ読み込まれるためスキャン量が減る。
CREATE EXTERNAL TABLE IF NOT EXISTS action_log (
  user_id string,
  action_category string,
  year int,
  month int,
  day int
)
PARTITIONED BY (year int, month int, day int)
STORED AS PARQUET
LOCATION 's3://athena-examples/action-log/’
TBLPROPERTIES ('PARQUET.COMPRESS'='SNAPPY');

WHERE句で 2016年の4月~7月のデータを指定

SELECT
  month
  , action_category
  , action_detail
  , COUNT(user_id)
FROM
  action_log
WHERE
  year = 2016
  AND month >= 4
  AND month < 7
GROUP BY
  month
  , action_category
  , action_detail

以下のS3パスのみ読み込まれるのでスキャン量を削減できる
image.png

パーティションの分け方

  • s3://athena-examples/action-logs/year=2020/month=02/day=21/data_01.gz のように、col=val1/col2=val2 のような Hive 標準の方が推奨
    • MSCK REPAIR TABLE` は、パーティションを Athena で認識されるためのコマンド
  • s3://athena-examples/action-logs/2020/02/21/data_01.gz のように val1/val2 のような形式もありだが少し面倒

image.png

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?