[レポート](ANT222) Analytics with Amazon Athena (フェデレーテッドクエリ ワークショップ) #reinvent

2019.12.24

本記事はAWS re:Invent 2019のワークショップ「Analytics with Amazon Athena」のレポートです。セッション概要には、Amazon Athenaによるデータ分析ハンズオンのように書かれていますが、実際の内容は、Amazon Athenaの新しいフェデレーテッドクエリによる複数データソースの検索を実践するハンズオンです。

※ 本セッションの内容はプレビューを体験するワークショップのため、予告なく変更されることが予想されますが、ご了承ください。

ワークショップの内容は、GitHubで公開されている内容ですが、実際に私がワークショップで指定した具体例に基づき解説していますので、皆さんも簡単にワークショップを体験していただけるはずです。

ワークショップの概要

Amazon Athena is an interactive query service that makes it easy to analyze data in Amazon Simple Storage Service (Amazon S3) using standard SQL. Athena is serverless, and customers pay only for the queries they run. In this workshop, we dive deep into various use cases for Athena, including building applications that run on schedules, using CTAS and INSERT INTO as effective self-service ETL tools, and querying storage formats. We also look at authorization, authentication, and managing costs. If you are a data engineer looking to onboard your organization to Athena, this workshop equips you with the tools to be successful.

Amazon Athenaは、標準SQLを使用してAmazon Simple Storage Service(Amazon S3)のデータを簡単に分析できるインタラクティブなクエリサービスです。 Athenaはサーバーレスであり、顧客は実行したクエリに対してのみ支払います。 このワークショップでは、Athenaのさまざまなユースケースを深く掘り下げます。これには、スケジュールで実行されるアプリケーションの構築、CTASおよびINSERT INTOの効果的なセルフサービスETLツールとしての使用、ストレージ形式のクエリが含まれます。 また、承認、認証、および管理のコストも検討します。 組織がAthenaに導入を検討しているデータエンジニアの場合、このワークショップは成功するためのツールを備えています。

スピーカー

Workshop - Analytics with Amazon Athena

ワークショップの内容

Amazon Athenaのフェデレーテッドクエリを用いて、AthenaからCloudwatch Logsに対してクエリを実行します。

  • AthenaでAmazon Cloudwatch Logsに接続する
  • カスタムデータソースの作成
  • ユーザー定義関数の作成
  • クエリの実行

Amazon Athenaのフェデレーテッドクエリ(Preview)

  • 構造化、非構造化のオブジェクトもしくはカスタムデータに対してクエリを実行する
  • オンプレミス、クラウドデータソース問わずクエリを実行する
  • アドホックな調査、複雑なパイプライン、アプリケーション問わず利用される

現在利用可能なデータソースコネクタ

  • Hbase
  • DocumentDB
  • DynamoDB
  • JDBC
  • Redis
  • CloudWatchLogs
  • CloudWatch Metrics
  • TPDS Data Generator

Lambdaを用いたサーバレスビックデータ

並列スキャンの場合、1つのクエリで15億行/秒および100Gbpsを超えてテストされています。

  • パーティションプルーニング
  • 並列スキャン
  • ポータブルなカラムナメモリ形式(Apache Arrow)
  • プリディケイト・プッシュダウン
  • 輻輳制御/回避

How To Build & Deploy

awslabs/aws-athena-query-federationHow To Build & Deployの手順に従い、AthenaからCloudwatch Logsに接続します。本来はチュートリアルを開始する前に、proper permissions/policies to deploy/use Athena Federated Queriesの記載にあるIAMユーザーを作成しますが、今回は管理者権限(マネージドポリシーAdministratorAccess)を持つユーザで実施しました。ワークショップでは、コードの編集やビルド、デプロイはCloud9 Instance上で行います。

  • プレビューは、us-east-1AmazonAthenaPreviewFunctionalityというAthenaのWorkgroupを作成し、クエリを実行する際には設定しなければなりません

Step 0: How to deploy a pre-built connector

事前に構築されたコネクタを展開して、基本的なビルディングブロック(Lambda、サーバーレスアプリケーションリポジトリ、およびSQLでのLambdaの使用)を理解します。(How To Deploy A Connectorを参照)

Step 1: Create Your Cloud9 Instance

  1. AWSコンソールを開き、Cloud9サービスに移動します
  2. Create Environmentをクリックし、手順に従ってAmazon Linuxを実行している新しいEC2インスタンス(推奨m5.large)を使用して新しいインスタンスを作成します。

Step 2: Download The SDK + Connectors

  1. Cloud9ターミナルで実行git clone https://github.com/awslabs/aws-athena-query-federation.gitを実行して、Amazon Athena Query Federation SDK、Connector Suite、およびExample Connectorのコピーを取得します。

Step 3: Install Prerequisites for Development

  1. Apache Maven、AWS CLI、およびAWS SAMビルドインストールするため、チェックアウトしたGithubプロジェクトのルートで./tools/prepare_dev_env.shスクリプトを実行します。source ~/.profileを実行して環境変数を設定します。
  2. athena-federation-sdkディレクトリからmvn clean install -DskipTests=true > /tmp/logを実行します。

Step 4: Write The Code

  1. s3バケットを作成します
    • データ保存用のバケット(例. cm-athena-federation-data)
    • 結果出力用のバケット(例. cm-athena-federation-results)
    • Spill用のバケット(例. cm-athena-federation-lambda-spill)
    • サーバレスリポジトリバケット(例. awsserverlessrepo-123456789012-us-east-1)
  2. Cloud9の左側のナビゲーションにあるaws-athena-query-federation/athena-exampleフォルダーに移動します
    • ExampleMetadataHandlerを開き、TODOのコードをコメントインする
    • ExampleRecordHandlerを開き、TODOのコードをコメントインする
    • ExampleUserDefinedFuncHandlerを開き、TODOのコードをコメントインする
  3. aws-athena-query-federation/athena-exampleディレクトリの下にあるサンプルデータ(sample_data.csv)をデータ保存用のバケット(s3://cm-athena-federation-data/2017/11/1/sample_data.csv)にアップロードします

Step 5: Package and Deploy Your New Connector

コネクタをデプロイするには、サーバーレスアプリケーションリポジトリを介してLamdaにデプロイします。

コネクタをサーバーレスアプリケーションリポジトリに公開するには、

../tools/publish.sh awsserverlessrepo-123456789012-us-east-1 athena-example us-east-1を実行して、コネクタをプライベートAWSサーバーレスアプリケーションリポジトリに公開します。

次に、Serverless Application Repository移動し、[Private applications]をクリックし、[Show apps that create custom IAM roles or resource policies]チェックボックスをオンにして、Athenaから使用する前にアプリケーションを検索してデプロイします。

サーバーレスアプリケーションリポジトリコンソールでコネクタを構成するときは、DataCatalog / Lambda関数名は小文字を使用してください。

登録が成功すると以下のように表示されます。

Step 6: Validate our Connector

コネクタとAthenaの連携動作の検証ツールとしてコマンドが用意されています。DataCatalog / Lambda関数名に付けた名前でlambda_funcを指定します。

../tools/validate_connector.sh --lambda-func exampleathenaconnector --schema schema1 --table table1 --constraints year=2017,month=11,day=1

すべてが期待どおりに機能した場合、スクリプトは最後に以下のメッセージを出力して終わります。

2019-12-23 20:25:08 <> INFO  ConnectorValidator:==================================================
2019-12-23 20:25:08 <> INFO  ConnectorValidator:Successfully Passed Validation!
2019-12-23 20:25:08 <> INFO  ConnectorValidator:==================================================

Step 7: Run a Query!

最後にAthenaからクエリを実行します。実行の際には、WorkgroupをAmazonAthenaPreviewFunctionalityに変更してください。このWorkgroupは、Preview(UDF、フェデレーション)でクエリが有効になっていることを確認します。

クエリエディタに以下のクエリを入力して実行します。

USING FUNCTION extract_tx_id(value ROW(id INT, completed boolean) ) 
        RETURNS INT TYPE LAMBDA_INVOKE
WITH (lambda_name = 'exampleathenaconnector'), FUNCTION decrypt(payload VARCHAR ) 
        RETURNS VARCHAR TYPE LAMBDA_INVOKE
WITH (lambda_name = 'exampleathenaconnector')
SELECT year,
         month,
         day,
         account_id,
         decrypt(encrypted_payload) AS decrypted_payload,
         extract_tx_id(transaction) AS tx_id
FROM "lambda:exampleathenaconnector".schema1.table1
WHERE year=2017
        AND month=11
        AND day=1
;

最後に

フェデレーテッドクエリは、オンプレミス、クラウドデータソース問わずクエリを実行できるので、データソースの選択肢が広がります。このワークショップのハマリポイントをもう一度おさらいします。

  • リージョンは、US-EAST-1
  • Workspaceは、AmazonAthenaPreviewFunctionality
  • DataCatalog / Lambda関数名は小文字を使用

ワークショップの内容は、プレビュー中ということもあり、まだ登録手順が複雑であったり、登録したはずのデータベース名やテーブル名が表示されなかったりと、フェデレーテッドクエリはGAに向けて進化の過程にあります。しかし、フェデレーテッドクエリの動作原理を理解するには今しか体験できないワークショップとも言えます。プレビュー中ですが、多くの方にこのワークショップを体験していただき、AWSへフィードバックをしてほしいとRoy Hasson さんがおっしゃっていたことを最後にお伝えします。

合わせて読みたい

[レポート] (ANT307) Athena deep dive #reinvent2019