サーバーレスのクエリサービス「Amazon Athena」のチュートリアルでS3上のログを集計してみる

記事タイトルとURLをコピーする

こんにちは。技術1課@大阪オフィスの柏尾です。

今回はre:Inventで発表された「Amazon Athena」について書いてみようと思います。(re:Inventの動画はこちら

Amazon Athena とは

Amazon Athenaはまとめると、下記のようなサービスです。

 

  • Athenaは新しいサーバーレスのクエリサービスで、分散SQLエンジンのためのクラスタ構築・運用が不要
  • Amazon S3に保存された膨大な量のデータを、標準SQLを使って簡単に分析できる(分散SQLエンジンPrestoベース)
  • 利用者はS3に保存したデータに対して、テーブルやフィールドを定義、クエリを実行するだけ
  • 実行クエリがスキャンしたデータ量に対してのみの課金($5/TB)
  • JSON、CSV、ログファイル、カスタム区切りのテキスト、Apache Parquet、Apache ORC等を含む様々なフォーマットに対応
  • AWS Management Console、Amazon QuickSightからのクエリ発行、Athena JDBCドライバを使うことで各種SQLクライアントからも接続可能

Amazon Athena を試してみる

サンプルのログ(ELBのログ)を集計するチュートリアルが用意されていますので、すぐにその機能を試すことができるようになっています。

チュートリアルの開始

athena_tutorial_01

右上にチュートリアルを開始するリンクがありますのでこれをクリックします。

※2016年12月時点で、Athenaのサービスを利用できるリージョンはバージニア、オレゴンです。
athena_tutorial_02

S3に保存されたデータに対してテーブルを定義するためのウィザードを実行していきます。「Next」で次に進みます。athena_tutorial_03

Step1. データベース名・テーブル名・ログ場所の指定

データベース名、テーブル名、ログの場所などを指定します。

Database「Create new Database」を選択
Name of new databasedefault
Table Nameelb_logs
Location of Iput Datas3://athena-examples/elb/plaintext/

athena_tutorial_04

Step2. データフォーマット

データフォーマットは「Apache Web Logs」を指定します。

Regexの部分は、正規表現を使ってログのマッチする部分を抽出し、それをテーブルのフィールドとみなすための定義になります。 今回はELBのログが対象となります。チュートリアルのウィンドウ部分にELB用の正規表現が表示されていますので、それをそのままコピペします。

 

Data Format「Apache Web Logs」を選択
Regex※チュートリアルのウィンドウの正規表現をコピペ

athena_tutorial_05

Step3. カラム定義

次のステップではカラム定義を行います。カラム名とカラムタイプを指定していきます。 チュートリアルでは左に表示されるウィンドウの「here」というリンクをクリックするとすべてのカラムが自動的に入力されます。
athena_tutorial_06

Step4. パーティション設定(オプション)

オプションとしてパーティション設定をすることができます。パーティションが利用可能な場合、クエリ実行時のデータスキャン範囲を限定できるため、コストの抑制・パフォーマンスの向上が可能になります。尚、今回のチュートリアルではスキップします。
athena_tutorial_07

テーブル作成のクエリを実行

ウィザードが完了すると、テーブル作成用のクエリが構成されますので、「Run Query」をクリックし、テーブルの作成を実行します。

athena_tutorial_08

クエリの実行が完了すると、左部分に作成されたテーブル「elb_logs」が表示されます。
athena_tutorial_09

集計クエリを実行

作成したテーブルに対してクエリを実行します。

「Saved Queries」タブをクリックし、保存されているクエリを表示します。 デフォルトで「ELB Select Query」というクエリが保存されていますので、リンクをクリックします。
athena_tutorial_10

保存されているクエリが表示されます。

athena_tutorial_11

テーブル名が「elb_logs_orc」となっていますので、これを「elb_logs」に修正し、「Run Query」ボタンを押します。 ページ下部に結果が表示されれば成功です。
athena_tutorial_12

クエリの履歴を表示

「History」タブをクリックすると、過去に実行されたクエリの一覧が表示されます。 今回実行したクエリも表示されています。

実行ステータスや、スキャンしたデータのサイズが表示されています。 今回のクエリは3.73秒、スキャンしたデータは387.73MBになっています。

実行結果はS3上に保存されており、「Download results」から結果をダウンロードすることもできます。
athena_tutorial_13

クエリ実行結果の保存先

「Setting」からは、クエリ実行結果の保存先の変更が可能になっています。

athena_tutorial_14

デフォルトでは、「s3://aws-athena-query-results-<アカウントID>-<リージョン>/」というバケットが指定されていました。athena_tutorial_15S3上にはバケットが作成されており、その配下には下記のようなパスで実行結果のcsvが保存されています。
athena_tutorial_16

実行結果のCSVをダウンロードして中身を確認します。

athena_tutorial_17

データのプレビュー・テーブルの詳細情報

テーブル横にある目のマークをクリックすると、そのテーブルに入っているデータのプレビューを見ることができます。

athena_tutorial_20

 

また、テーブル名の横にあるテーブルアイコンをクリックするとテーブルのプロパティが表示されます。 データの入出力フォーマット、データSerialize/Deserialize用ライブラリの情報も表示されます。

athena_tutorial_18

 

athena_tutorial_19

まとめ

これまでは、S3に保存した大量データの集計には、

  • EMRでクラスタを立ち上げ、HiveやPrestoを使ってS3上のデータに対してクエリ発行
  • RedshiftなどのDWH用データベースにデータ整形して保存後、クエリにて集計
  • Query-as-a-Service(BigQueryやTreasure Dataなど)にデータを取り込み、クエリ実行

などの方法がありましたが、Athenaは新たな選択肢の一つになるのではないかと思います。

「Amazon Athena に CloudTrailのログを取り込んでみた」もご参考ください。