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

サーバレスで Presto が使える Amazon Athena 使いこなし術 [2020年版]

サーバレスで Presto が使える Amazon Athena 使いこなし術 [2020年版]

Presto Conference Tokyo 2020 (Online) 登壇コンテンツ
https://techplay.jp/event/795265

Makoto Kawamura

November 20, 2020
Tweet

More Decks by Makoto Kawamura

Other Decks in Technology

Transcript

  1. © 2020, Amazon Web Services, Inc. or its Affiliates. Amazon

    Web Services Japan, K.K. Solution Architect 川村 誠 2020/11/20 サーバレスで Presto が使える Amazon Athena 使いこなし術 [2020年版]
  2. © 2020, Amazon Web Services, Inc. or its Affiliates. ⾃⼰紹介

    川村 誠 Hadoop/Spark スペシャリスト ソリューションアーキテクト • データ分析系サービスを担当 • 好きなサービス • Amazon EMR • Amazon Athena • AWS Glue • Amazon SageMaker
  3. © 2020, Amazon Web Services, Inc. or its Affiliates. アジェンダ

    l Athena 概要 l Athena ならではの最新機能 l パフォーマンスチューニング Tips
  4. © 2020, Amazon Web Services, Inc. or its Affiliates. Amazon

    Athena とは Amazon Simple Storage Service (Amazon S3) 内 のデータを 標準 SQL を使⽤して簡単に分析可能とする インタラクティブなクエリサービス
  5. © 2020, Amazon Web Services, Inc. or its Affiliates. Amazon

    Athena の特徴 サーバレスでインフラ管理不要 ⼤規模データに対しても⾼速なクエリ 事前のデータロードなしに Amazon S3 に直接クエリ スキャンしたデータに対しての従量課⾦ JDBC / ODBC / API 経由で BI ツールやシステムと連携
  6. © 2020, Amazon Web Services, Inc. or its Affiliates. Amazon

    Athena コンソール コンソールのクエリエディタから 定義されたテーブルに対し、即座に クエリを発⾏することが可能 デフォルトは Hive metastore 互換 の Glue Data Catalog に登録された データベース・テーブル定義を データソースとして使⽤ テーブル定義⽅法 • DDL • Glue Catalog API • Glue Crawler l データソース l データベース l テーブル/ビュー l クエリエディター
  7. © 2020, Amazon Web Services, Inc. or its Affiliates. Amazon

    Athena Athena API l アプリケーションから AWS SDK 経由で Athena API を利⽤可能 l クエリ実⾏ API: ⾮同期処理 (JDBC 接続と異なる) 1. StartQueryExecution でクエリを実⾏して QueryExecutionId を取得 2. GetQueryExecution で実⾏状況を確認 3. State が SUCCEEDED になったら GetQueryResults で結果を取得 l その他、カタログ管理やタグ、workgroups などを API から操作可能
  8. © 2020, Amazon Web Services, Inc. or its Affiliates. Amazon

    Athena Amazon EventBridge を利⽤したクエリ実⾏成否の監視 l Amazon EventBridge を使⽤して、クエリの状態に関するリアルタイムの通知 を受け取ることが可能 Lambda function Email Amazon Athena Amazon EventBridge Rule Amazon Simple Notification Service イベント 成功 失敗 クエリの状態が遷移 後続処理をキック
  9. © 2020, Amazon Web Services, Inc. or its Affiliates. Amazon

    Athena CloudTrail を利⽤した利⽤状況のロギング l Athena の全ての API コールは CloudTrail によって収集される l 収集される下記情報から、Athena に対してどのようなリクエストが⾏われた かを判断可能 • リクエストの作成元の IP アドレス • リクエストの実⾏者 • リクエストの実⾏⽇時 • Athena で実⾏されたアクション
  10. © 2020, Amazon Web Services, Inc. or its Affiliates. Amazon

    Athena workgroups l 同⼀アカウント内で、仮想的なワークグループを作成することが可能 l ワークグループごとに下記設定を実施可能 • エンジンバージョンの設定 • クエリワークロードの分離 • クエリメトリクスの分離 • クエリ毎のスキャン量上限設定 l スキャン量が⼀定を超えたらアラームをあげることも可能
  11. © 2020, Amazon Web Services, Inc. or its Affiliates. Athena

    ならではの最新機能 • Athena エンジンバージョン 2 • Federated SQL Queries (GA) • Partition Projection
  12. © 2020, Amazon Web Services, Inc. or its Affiliates. Athena

    エンジンバージョン 2 l 新しいエンジンがリリース (2020.11.11) l Presto ベースバージョン: Presto 0.217 l 対応リージョン: バージニア北部、オハイオ、オレゴン l 新機能 l Amazon Athena Federated Queries … re:Invent 2019 で発表された機能が GA (詳細後述) l Geospatial functions, Schema evolution, Nested Schema, Spill to disk l 性能改善 l JOIN, ORDER BY, AGGREGATE 操作 New https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference.html
  13. © 2020, Amazon Web Services, Inc. or its Affiliates. Athena

    エンジンバージョン 2 https://docs.aws.amazon.com/athena/latest/ug/engine-versions-changing.html l エンジンバージョンは workgroup ごとに設定可能 l エンジンバージョン設定変更は⼿動と⾃動を選択可能 l 設定変更前の事前通知あり l ⾃動にした場合、⾮互換性が検出されない限り、⾃動更新 l 利⽤中エンジンバージョンはコンソールと workgroup 画⾯で確認可能 New コンソール (クエリエディタ下部) Workgroup リスト
  14. © 2020, Amazon Web Services, Inc. or its Affiliates. Amazon

    Athena Federated Queries https://github.com/awslabs/aws-athena-query-federation https://aws.amazon.com/jp/blogs/news/query-any-data-source-with-amazon-athenas-new-federated-query/ ※ コネクター実装チュートリアル動画も掲載されています(英語) l リレーショナル、⾮リレーショナル、 オブジェクト、またはカスタムデータ ソース間でクエリを実⾏する l オンプレミスまたはクラウドデータ ソース間でクエリを実⾏する l アドホックな調査、複雑なパイプライン、 アプリケーションに使⽤可能 l データソースコネクターを利⽤して Athena クエリエンジンを拡張できる GA
  15. © 2020, Amazon Web Services, Inc. or its Affiliates. Federated

    Queries の仕組み https://github.com/awslabs/aws-athena-query-federation https://aws.amazon.com/jp/blogs/news/query-any-data-source-with-amazon-athenas-new-federated-query/ ※ コネクター実装チュートリアル動画も掲載されています(英語)
  16. © 2020, Amazon Web Services, Inc. or its Affiliates. Federated

    Queries を実⾏すると https://github.com/awslabs/aws-athena-query-federation https://aws.amazon.com/jp/blogs/news/query-any-data-source-with-amazon-athenas-new-federated-query/ ※ コネクター実装チュートリアル動画も掲載されています(英語)
  17. © 2020, Amazon Web Services, Inc. or its Affiliates. Federated

    Queries は簡単に利⽤可能 https://github.com/awslabs/aws-athena-query-federation https://aws.amazon.com/jp/blogs/news/query-any-data-source-with-amazon-athenas-new-federated-query/ ※ コネクター実装チュートリアル動画も掲載されています(英語) デプロイ 登録 記述
  18. © 2020, Amazon Web Services, Inc. or its Affiliates. データソースコネクターをデプロイする⽅法

    https://github.com/awslabs/aws-athena-query-federation https://aws.amazon.com/jp/blogs/news/query-any-data-source-with-amazon-athenas-new-federated-query/ ※ コネクター実装チュートリアル動画も掲載されています(英語) l データソースコネクターは AWS Lambda ベース l 2つのデプロイ⽅法 1. AWS Serverless Application Repository を利⽤した 1-クリックデプロイ 2. AWS Lambda にコネクターのコードをデプロイ
  19. © 2020, Amazon Web Services, Inc. or its Affiliates. Athena

    コンソールを利⽤してコネクターを登録 https://github.com/awslabs/aws-athena-query-federation https://aws.amazon.com/jp/blogs/news/query-any-data-source-with-amazon-athenas-new-federated-query/ ※ コネクター実装チュートリアル動画も掲載されています(英語)
  20. © 2020, Amazon Web Services, Inc. or its Affiliates. 現時点で利⽤可能なデータソースコネクター

    https://docs.aws.amazon.com/athena/latest/ug/athena-prebuilt-data-connectors.html https://github.com/awslabs/aws-athena-query-federation l CloudWatch Connector l CloudWatch Metrics Connector l CMDB Connector l DocumentDB Connector l DynamoDB Connector l Elasticsearch Connector l HBase Connector l Connector for JDBC-Compliant Data Sources l Redis Connector l Timestream Connector l TPC Benchmark DS (TPC-DS) Connector l Neptune Connector * l Vertica Connector * * 現在開発中
  21. © 2020, Amazon Web Services, Inc. or its Affiliates. カスタムコネクターを独⾃実装可能

    l Athena Query Federation SDK を 使⽤して、独⾃のデータソースへ のコネクタを作成可能 l Features: • S3 spill • Partition pruning • Parallel scans • Portable columnar memory-format (Apache Arrow) • Authorization • Congestion control/avoidance https://docs.aws.amazon.com/athena/latest/ug/connect-data-source-federation-sdk.html https://github.com/awslabs/aws-athena-query-federation
  22. © 2020, Amazon Web Services, Inc. or its Affiliates. Federated

    Queries – 制限事項 l エンジンバージョン Athena エンジンバージョン 2 でのみ利⽤可能 l 対応リージョン バージニア北部、オハイオ、オレゴン l View Federated データソースで View は使⽤不可 https://docs.aws.amazon.com/athena/latest/ug/connect-to-a-data-source.html#connect-to-a-data-source-considerations
  23. © 2020, Amazon Web Services, Inc. or its Affiliates. Partition

    Projection Partition Projection はパーティション数が⾮常に多いテーブルに対するクエリ 処理を⾼速化し、パーティション管理を⾃動化するための機能 Query Planning Time API Call • テーブルに⾮常に多くのパーティションが ある場合、AWS Glue Data Catalog に対す るパーティション取得 API (GetPartitions) の呼び出しがクエリパフォーマンスに影響 を及ぼす Partition Projection • Partition Projection を利⽤するとパーティ ション情報を Athena ⾃⾝で計算できるよ うになるため、GetPartitions API 呼び出し の影響を回避し、パーティションプルーニ ングによるクエリ⾼速化の恩恵を享受でき るようになる https://docs.aws.amazon.com/ja_jp/athena/latest/ug/partition-projection.html
  24. © 2020, Amazon Web Services, Inc. or its Affiliates. (参考)

    パーティションプルーニング パーティションプルーニングを利⽤すると、適⽤されるパーティションにだけに 処理が実⾏されるので、多くの場合クエリが⾼速化する 以下の Amazon S3 パスのデータのみスキャン対象となる s3://athena-examples/action-log/year=2016/month=04/day=01/ s3://athena-examples/action-log/year=2016/month=04/day=02/ s3://athena-examples/action-log/year=2016/month=04/day=03/ ... s3://athena-examples/action-log/year=2016/month=06/day=30/ 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
  25. © 2020, Amazon Web Services, Inc. or its Affiliates. Partition

    Projection – ユースケース • データの追加に合わせて定期的にパーティションをテーブルに追加している場合 • ⾮常に多くのパーティションがあるテーブルに対するクエリが想定外に遅い場合 • ⾮常に多くのパーティション化されたデータが S3 に保存されており、メタデー タストアで管理するのが現実的でなく、クエリで参照する対象のデータがほんの ⼀部の場合 利⽤条件 パーティションが予測可能なパターンに従う場合に Partition Projection を利⽤することができる https://docs.aws.amazon.com/ja_jp/athena/latest/ug/partition-projection.html Projection Type パターン 例 整数 整数の連続シーケンス [1, 2, 3, 4, ..., 1000] や [0500, 0550, ..., 2500] など ⽇付 ⽇付/⽇時の 連続シーケンス [20200101, 20200102, ..., 20201231]、 [1-1-2020 00:00:00, 1-1-2020 01:00:00, ..., 12-31-2020 23:00:00] など 列挙値 列挙値の有限セット 空港コードや AWS リージョンなど
  26. © 2020, Amazon Web Services, Inc. or its Affiliates. Partition

    Projection – 設定例 • DDL のテーブルプロパティとして、Partition Projection を設定する • 次の設定例では、⽇付範囲の上限に NOW を使⽤することで、1 時間毎に新しい データが⾃動的にクエリ可能になる ... LOCATION "s3://bucket/prefix/" PARTITIONED BY ( datehour STRING ) TABLE PROPERTIES ( "projection.enabled" = "true", "projection.datehour.type" = "date", "projection.datehour.range" = "2018/01/01/00,NOW", "projection.datehour.format" = "yyyy/MM/dd/HH", "projection.datehour.interval" = "1", "projection.datehour.interval.unit" = "HOURS", "storage.location.template" = "s3://bucket/prefix/${datehour}” ) https://docs.aws.amazon.com/ja_jp/athena/latest/ug/partition-projection-kinesis-firehose-example.html
  27. © 2020, Amazon Web Services, Inc. or its Affiliates. Partition

    Projection – 制限事項 https://docs.aws.amazon.com/ja_jp/athena/latest/ug/partition-projection.html#partition-projection-considerations-and-limitations • Projection されたパーティションに空のパーティションが多すぎる場合、 従来の AWS Glue パーティションに⽐べてパフォーマンスが低下する 可能性がある • Projection パーティションの半分以上が空の場合は、従来のパー ティション利⽤を推奨 • Partition Projection は、Athena の独⾃機能 • Amazon Redshift Spectrum または Amazon EMR などの別のサービ スを通じて同じテーブルが読み取られた場合、標準パーティション メタデータが使⽤される
  28. © 2020, Amazon Web Services, Inc. or its Affiliates. (参考)

    AWS Glue Partition Indexes https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/create-table.html l AWS Glue Data Catalog に実装された新しい機能 l Partition Indexes を使⽤すると、パーティション情報が⾼速で検索可能となり、 不要なデータ転送・処理が減ることで、クエリ処理時間を短縮できる l インデックスに指定可能なパーティションキーの型は⽂字列、もしくは、数値 (int, bigint, long, tinyint, and smallint) l テーブル作成時に指定する create-table [--catalog-id <value>] --database-name <value> --table-input <value> [--partition-indexes <value>] [--cli-input-json | --cli-input-yaml] [--generate-cli-skeleton <value>] ※ パーティションキーを (year, month, dayofmonth) と想定 [ { "Keys": ["year","month","dayofmonth"], "IndexName": "idx01" }, { "Keys": ["year","month"], "IndexName": "idx02" }, { "Keys": ["year"], "IndexName": "idx03" } ] New 最⼤3パターン
  29. © 2020, Amazon Web Services, Inc. or its Affiliates. パフォーマンスチューニング

    Tips トップ10 l ストレージのベストプラクティス 1. データをパーティションに分ける 2. バケッティングでデータを分割する 3. ファイルを圧縮・分割する 4. ファイルサイズを最適化する 5. 列指向データの作成を最適化する l クエリチューニング 6. ORDER BY を最適化する 7. JOIN を最適化する 8. GROUP BY を最適化する 9. 近似関数を使う 10.必要なカラムだけを読み込む https://aws.amazon.com/jp/blogs/news/top-10-performance-tuning-tips-for-amazon-athena/
  30. © 2020, Amazon Web Services, Inc. or its Affiliates. Athena

    ならではのパフォーマンスチューニング Tips パーティション処理の最適化 l テーブルに⾮常に多くのパーティションがある場合、パーティション 情報処理が Athena のクエリにおけるボトルネックとなる場合がある l このオーバーヘッドを⼩さくするための 2 つの⽅法: 1. 各パーティションカラムに対して明⽰的にひとつを指定して、単⼀の パーティションを対象とした処理を⾏う⽅法 2. Partition Projection を⽤いて、メタストアからパーティション情報を 取り出さずに、パーティション情報を計算してクエリを実施する⽅法
  31. © 2020, Amazon Web Services, Inc. or its Affiliates. 1.

    単⼀パーティションへのクエリ l パーティションを持つテーブルにクエリを実⾏する際、WHERE 句で単⼀パー ティションを明⽰的に指定すると、パーティション情報処理がスキップされる l 結果、テーブルに含まれるパーティション数にかかわらず、クエリは⼀定時間 でパーティション情報を取得することが可能 l パーティションカラムのデータ型が STRING 形のときにのみ 適⽤される クエリ テーブルパーティション数 無 10000 100000 SELECT * FROM lineitem where l_orderdate = "1998-11-21" and l_orderkey = "512343" 10.3 秒 2.7 秒 3.1 秒 SELECT * FROM lineitem where l_orderkey = "512343" 10.1 秒 32.5 秒 379.1 秒 ※ l_orderdate がこのテーブルのパーティションカラム
  32. © 2020, Amazon Web Services, Inc. or its Affiliates. 2.

    Partition Projection の利⽤ l 下記の前提条件のもとで、Partition Projection を利⽤した場合のクエリ パフォーマンスを検証する • ⽶国東部(バージニア州北部)リージョン • 1テーブル • 1.2 億レコード • 4.8 GB • 7300 パーティション • Parquet ファイル ... LOCATION "s3://bucket/prefix/" PARTITIONED BY ( year string, month string, dayofmonth string ) TABLE PROPERTIES ( "projection.enabled" = "true", "projection.year.type" = "integer", "projection.year.range" = "1987,2008", "projection.month.type" = "integer", "projection.month.range" = "1,12", "projection.dayofmonth.type" = "integer", "projection.dayofmonth.range" = "1,31" ) Partition Projection 設定
  33. © 2020, Amazon Web Services, Inc. or its Affiliates. ベンチマーク結果

    # Partition Projection  Partition Projection  Partition Projection  Partition Projection  1 6.07 2.34 4.64 1.90 2 5.50 2.64 5.88 2.16 3 5.25 2.84 5.33 2.33 4 6.00 2.45 4.96 1.98 5 4.69 2.71 5.79 1.84 6 5.86 3.54 4.94 2.40 7 6.03 2.57 5.07 2.76 8 4.97 2.64 5.17 2.23 9 6.11 2.70 5.02 2.39 10 5.73 2.71 5.46 2.40 sum 56.21 27.14 52.26 22.39 v1 v2 SELECT origin, count(1) as cnt FROM "rita_p" where year='2006' and dayofmonth='6' and (origin = 'ATL' or origin = 'SFO’) group by origin order by cnt
  34. © 2020, Amazon Web Services, Inc. or its Affiliates. ベンチマーク結果

    SELECT origin, count(1) as cnt FROM "rita_p" where year='2006' and dayofmonth='6' and (origin = 'ATL' or origin = 'SFO’) group by origin order by cnt # Partition Projection  Partition Projection  Partition Projection  Partition Projection  1 6.07 2.34 4.64 1.90 2 5.50 2.64 5.88 2.16 3 5.25 2.84 5.33 2.33 4 6.00 2.45 4.96 1.98 5 4.69 2.71 5.79 1.84 6 5.86 3.54 4.94 2.40 7 6.03 2.57 5.07 2.76 8 4.97 2.64 5.17 2.23 9 6.11 2.70 5.02 2.39 10 5.73 2.71 5.46 2.40 sum 56.21 27.14 52.26 22.39 v1 v2
  35. © 2020, Amazon Web Services, Inc. or its Affiliates. まとめ

    l Athena ならではの機能・最新機能 • Athena エンジンバージョン 2 • Federated SQL Queries (GA) • Partition Projection l パフォーマンスチューニング Tips • パーティション処理の最適化