Slide 1

Slide 1 text

AthenaのPartition Projectionを調べてみた︕ 2024/07/25 ⽔村 健太 BigData-JAWS 勉強会 #27

Slide 2

Slide 2 text

⾃⼰紹介 ⽔村 健太 (X:@kensan773) 所属 某シンクタンク 社会⼈5年⽬ ⾦融システム アプリ/インフラ開発担当 経歴 2021年8⽉~AWS上のシステム開発 2023年4⽉ 2023 AWS Jr. Champions選出 2023年5⽉~社内若⼿AWSコミュニティ⽴ち上げ 2023年9⽉~データ分析基盤構築案件にアサイン 本イベントの登壇経緯 じゅにちゃん仲間で運営の渡邊さんのお誘い 本LTは個⼈開発でAthenaを軽く触れた際の学びを共有

Slide 3

Slide 3 text

まずは復習から︕ パーティション(化)ってなんだっけ︖

Slide 4

Slide 4 text

パーティション化とは ◦ 雑に⾔うと…特定の項⽬でデータを階層ごとに整理する操作 ◦ パーティション化しないとどうなる︖ ◦ バケット全体をスキャン後、条件に合うデータを抽出 ◦ 余分なコストの発⽣と応答速度の低下につながる ◦ データが多数の場合、S3のリクエストレート制限 ◦ パーティション化をしてあげると︖ ◦ Glue Data Catalogからパーティション情報を取得 ◦ スキャン範囲をその情報に合致する箇所のみに限定 ◦ クエリのコストと速度を最適化 例)SELECT <列名> FROM <テーブル名> WHERE year = 2024 AND month = 03 AND day = 06 Amazon Athena Amazon S3 s3://<バケット名>/${year}/${month}/${day} AWS Glue Data Catalog 01 02 03 04 05 06 2024 01 02 03 パーティション情報取得 ※事前登録が必要 パーティション化の イメージ

Slide 5

Slide 5 text

パーティション化とは ◦ 雑に⾔うと…特定の項⽬でデータを階層ごとに整理する操作 ◦ パーティション化しないとどうなる︖ ◦ バケット全体をスキャン後、条件に合うデータを抽出 ◦ 余分なコストの発⽣と応答速度の低下につながる ◦ データが多数の場合、S3のリクエストレート制限 ◦ パーティション化をしてあげると︖ ◦ Glue Data Catalogからパーティション情報を取得 ◦ スキャン範囲をその情報に合致する箇所のみに限定 ◦ クエリのコストと速度を最適化 例)SELECT <列名> FROM <テーブル名> WHERE year = 2024 AND month = 03 AND day = 06 Amazon Athena Amazon S3 s3://<バケット名>/${year}/${month}/${day} 01 02 03 04 05 06 2024 01 02 03 パーティション化の イメージ パーティション情報取得 ※事前登録が必要 AWS Glue Data Catalog

Slide 6

Slide 6 text

増えていくパーティションに対応するには︖ よくあるパーティションの管理⽅法を2つ紹介

Slide 7

Slide 7 text

よくあるパーティション管理① ◦ Glue Crawlerで定期的にバケット全体をスキャンして更新 ◦ メリット ◦ ⾃動的にパーティションを検出する ◦ 商品名など連続性の無いキーの追加にも対応可能 ◦ Glueの⼀部である ◦ GUIポチポチで設定、定期実⾏が可能 ◦ テーブル作成も同時に作成してくれる ◦ デメリット ◦ 実⾏時間時間が⻑い ◦ データが⼤量な場合は特に影響が⼤きい ◦ 頻繁に⾏うとコストがかさむ ◦ $0.44/h(最低10分、その後1秒単位で課⾦) Amazon Athena Amazon S3 AWS Glue Data Catalog Crawler s3://<バケット名>/${year}/${month}/${day} 01 02 03 04 05 06 2024 07 01 02 03

Slide 8

Slide 8 text

よくあるパーティション管理② ◦ ALTER TABLE ADD PARTITION⽂を定期実⾏して更新 ◦ 以下のSQLをAthenaで実⾏することで特定のパーティションを追加 ALTER TABLE <テーブル名> ADD PARTITION (year='2024', month=ʻ03', day=ʻ07ʼ) LOCATION ʻs3://<バケット名>/2024/03/07ʼ; ◦ メリット ◦ 特定のパーティション追加のため実⾏時間が短い ◦ クエリ範囲が限られるためコストが節約できる ◦ デメリット ◦ 追加するパーティションが不明な場合は使えない ◦ ⾃作の定期更新処理が必要 ◦ EventBridgeスケジューラ等 Amazon Athena Amazon S3 AWS Glue Data Catalog s3://<バケット名>/${year}/${month}/${day} 01 02 03 04 05 06 2024 07 01 02 03 SQL

Slide 9

Slide 9 text

ここからが本題! AthenaのPartition Projectionって何︖

Slide 10

Slide 10 text

AthenaのPartition Projection(パーティション射影) とは ◦ 雑に⾔うと…パーティション管理を⾃動化してくれるAthenaの機能の⼀つ ◦ 継続して追加されるパーティションの管理が不要 ◦ あくまでもAthenaの機能であるためRedShiftやEMRでは使えない ◦ 2020年に追加されている機能のため新しいものではない(私が不勉強で知らなかっただけ笑) ◦ 次のスライドからポイントを2つ紹介 ◦ 事前にテーブルにパーティションパターンを設定 ◦ インメモリの計算処理による⾼速化

Slide 11

Slide 11 text

ポイント① 事前にテーブルにパーティションパターンを設定 ◦ 主な設定⽅法 ⽅法①CREATE EXTERNAL TABLE⽂中にTBLPROPERTIESで設定する 例)CREATE EXTERNAL TABLE <データベース名>,<テーブル名> PARTITIONED BY ( `partitioned_date` string ・・・任意の名前で良いが⾚字箇所は⼀致している必要あり ) TBLPROPERTIES ( 'projection.enabled'='trueʼ, ʻprojection.partitioned_date.typeʼ = ʻdateʼ, ・・・次のスライドで補⾜ 'projection.partitioned_date.format' = 'yyyy/MM/ddʼ, 'projection.partitioned_date.range' = '2020/10/01,NOWʼ, 'storage.location.template' = 's3://<バケットのパス>/${partitioned_date}ʼ ) ※設定は例かつ省略しているため、詳細は公式ドキュメントをご参考ください ⽅法②Glueコンソールから“テーブルの編集ページ“でTable propertiesで設定する ※上記TBLPROPERTIESの項⽬をキーバリュー形式で⼊⼒

Slide 12

Slide 12 text

ポイント① テーブルにパーティションパターンを事前設定 ◦ Partition Projectionでサポートされている型 ◦ 予測可能なパーティションパターン ◦ 整数(integer)… [1, 2, 3, 4, ..., 1000] , [0500, 0550, 0600, ..., 2500] など ◦ ⽇付(date)… [2010, ..., 2030] , [2024-01-01 00:00:00, ..., 2024-12-31 23:00:00] など ◦ 列挙値(enum)…郵便番号、証券コードなど ◦ 予測不可能なパーティションパターン ◦ 挿⼊型(injected型)…ユーザ名、デバイスID、UUIDで作成される項⽬など ◦ 注意)動的で柔軟にパーティション化できる⼀⽅、以下の条件を満たす必要がある ◦ クエリには必ずWHERE句でパーティションキーの値を少なくとも⼀つ含んでいること ◦ 値はデータを読み取らなくても評価できるリテラルまたは式であること ◦ 注意 ◦ 設定したパーティションの半数以上が空の場合、応答速度が低下するため前述の⽅法推奨

Slide 13

Slide 13 text

ポイント② インメモリの計算処理による⾼速化 ◦ 前述のGlue Crawler等でパーティション化されたテーブルにクエリを投げた場合 ◦ パーティション情報を取得するためGlue Data Catalogに対しGetPartitions APIを呼び出す ◦ パーティションが多数の場合、パフォーマンスに悪影響を及ぼす可能性 ◦ Partition Projectionでパーティション化されたテーブルにクエリを投げた場合 ◦ パーティション情報をTable propertiesを元にメモリ上で計算する ◦ インメモリの処理であるため⾼速であり、実⾏時間の短縮が⾒込める AWS Glue Data Catalog SQL AWS Glue Data Catalog SQL Glue Crawler等でパーティション管理する場合 Partition Projectionでパーティション管理する場合

Slide 14

Slide 14 text

おわりに Glue Crawler ALTER TABLE ADD PARTITION⽂ Partition Projection スキャン時間 中 低 無 コスト 中 低 低 管理の⼿間 低 ⾼ 低 設定難度 低 中 ⾼ 備考 空のパーティションが 半数以上ある場合は⾮推奨 ◦ 以下にあてはまる⽅はPartition Projectionを試してみてください︕ ◦ Glue Clawlerでコストや実⾏時間が気になっていた⽅ ◦ ALTER TABLE ADD PARTITION⽂で管理の⼿間を気にしていた⽅ 以上です、ありがとうございました︕