Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20240725_JAWSビックデータ支部_Athena_PartitionProjection

kensan773
July 25, 2024
380

 20240725_JAWSビックデータ支部_Athena_PartitionProjection

kensan773

July 25, 2024
Tweet

Transcript

  1. ⾃⼰紹介 ⽔村 健太 (X:@kensan773) 所属 某シンクタンク 社会⼈5年⽬ ⾦融システム アプリ/インフラ開発担当 経歴

    2021年8⽉~AWS上のシステム開発 2023年4⽉ 2023 AWS Jr. Champions選出 2023年5⽉~社内若⼿AWSコミュニティ⽴ち上げ 2023年9⽉~データ分析基盤構築案件にアサイン 本イベントの登壇経緯 じゅにちゃん仲間で運営の渡邊さんのお誘い 本LTは個⼈開発でAthenaを軽く触れた際の学びを共有
  2. パーティション化とは ◦ 雑に⾔うと…特定の項⽬でデータを階層ごとに整理する操作 ◦ パーティション化しないとどうなる︖ ◦ バケット全体をスキャン後、条件に合うデータを抽出 ◦ 余分なコストの発⽣と応答速度の低下につながる ◦

    データが多数の場合、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 パーティション情報取得 ※事前登録が必要 パーティション化の イメージ
  3. パーティション化とは ◦ 雑に⾔うと…特定の項⽬でデータを階層ごとに整理する操作 ◦ パーティション化しないとどうなる︖ ◦ バケット全体をスキャン後、条件に合うデータを抽出 ◦ 余分なコストの発⽣と応答速度の低下につながる ◦

    データが多数の場合、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
  4. よくあるパーティション管理① ◦ 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
  5. よくあるパーティション管理② ◦ 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
  6. AthenaのPartition Projection(パーティション射影) とは ◦ 雑に⾔うと…パーティション管理を⾃動化してくれるAthenaの機能の⼀つ ◦ 継続して追加されるパーティションの管理が不要 ◦ あくまでもAthenaの機能であるためRedShiftやEMRでは使えない ◦

    2020年に追加されている機能のため新しいものではない(私が不勉強で知らなかっただけ笑) ◦ 次のスライドからポイントを2つ紹介 ◦ 事前にテーブルにパーティションパターンを設定 ◦ インメモリの計算処理による⾼速化
  7. ポイント① 事前にテーブルにパーティションパターンを設定 ◦ 主な設定⽅法 ⽅法①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の項⽬をキーバリュー形式で⼊⼒
  8. ポイント① テーブルにパーティションパターンを事前設定 ◦ 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句でパーティションキーの値を少なくとも⼀つ含んでいること ◦ 値はデータを読み取らなくても評価できるリテラルまたは式であること ◦ 注意 ◦ 設定したパーティションの半数以上が空の場合、応答速度が低下するため前述の⽅法推奨
  9. ポイント② インメモリの計算処理による⾼速化 ◦ 前述の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でパーティション管理する場合
  10. おわりに Glue Crawler ALTER TABLE ADD PARTITION⽂ Partition Projection スキャン時間

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