ぺい

渋谷系アドテクエンジニアの落書き

AWS Athena + Glueを使ったデータ分析(パーティション自動化)

ログは見れる状態にして価値が出る

f:id:tikasan0804:20180625084333p:plain

ログは雑に集めてるんだけど、見れる状態になっていないというのは、ストレージ料金を食ってるだけのゴミなので、破棄するか見れるようにするのですが、見れるようにするのは、そもそも結構大変だったりする。そこでFirehose + Athena + Glueを組み合わせて良い感じにしたいと思います。

データの保存形式をどうするか

色々ある。今回はJSONを使います。

Firehose ログをS3にまとめてPUTする

tikasan.hatenablog.com

Athena 集めた生ログに集計をかける

aws.amazon.com

AthenaはSQLでデータ集計を実行できるサーバーレスサービスです。使い方に関しては以下の公式ドキュメントを見ればわかります。
ざっくり説明すると、AthenaはCreate TableでS3のデータに対する参照を作成して、SQLクエリで集計が出来ます。なので、Drop TableやInsertクエリしたとしても、実データを操作することは出来ません。(READだけって割り切れるので安全といえば安全)
S3のデータをAmazon Athenaを使って分析する | Amazon Web Services ブログ

Glue テーブル自動作成

aws.amazon.com

AWS Glue は抽出、変換、ロード (ETL) を行う完全マネージド型のサービスで、お客様の分析用データの準備とロードを簡単にします。AWS マネジメントコンソールで数回クリックするだけで、ETL ジョブを作成および実行できます。AWS Glue では、AWS に保存されたデータを指定するだけで AWS Glue によるデータ検索が行われ、テーブル定義やスキーマなどの関連するメタデータAWS Glue データカタログに保存されます。カタログに保存されたデータは、すぐに検索、クエリ、ETL で使用できます。AWS Glue では、データ変換とデータのロードプロセスを実行するコードが生成されます。

そして、今回はこのAthenaのテーブルを作成するのが、Glueです。
Glueでよく出てくるETLというワードについて補足。これは、Extract Transform Loadのことです。一言でいうと、データ再集計という意味です。

Glueを使う理由

Athenaは検索をかける時に、パーティションを切ることで、スキャン範囲を狭めて、コストを軽減、検索完了時間を短縮が出来るのですが、このパーティションを切る作業が微妙に面倒。(パーティションの範囲が増えるごとに切らないといけない) そのあたりの面倒な作業をGlueは自動的に良い感じにしてくれる。

Glueクローラーの作成

f:id:tikasan0804:20180626201308p:plain

Add information about your crawler

Crawler name
クローラーの名前をつけます。今回は雑に「firehose」とします。

Add a data store

Choose a data store
JDBCかS3を選べます。今回は「S3」を選択します

Include path
データを保存しているS3の場所。今回でいうと、「s3://put-by-firehose/firehose」になる。

Choose an IAM role

Create an IAM roleを選択して、適当な名前を指定するといい感じに出来上がります。

内容は、AWSGlueServiceRoleという公式のロールと、以下のようなS3に対しての権限が付与されたロールが作成されました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::put-by-firehose/firehose/*"
            ]
        }
    ]
}

Frequency

Glueをどれくらいの頻度で動かすかを指定出来ます。今回は、テスト的に動かすだけなので、「Run on demand」にします。

Database

どういう名前でAthenaのdatabaseを作成するか、または既にあるdatabaseを使うかを選択出来ます。今回はdatabaseを作成したいので、Add databaseで「firehose」を作成して、それをそのまま指定しました。

Review

f:id:tikasan0804:20180625083153p:plain

実行

CrawlerをRunする

f:id:tikasan0804:20180625083325p:plain f:id:tikasan0804:20180625083345p:plain

Athenaで確認する

f:id:tikasan0804:20180626075639p:plain

f:id:tikasan0804:20180626075751p:plain

テーブルは確かにいい感じになってるけど。。。。名前がああああ。 この名前をいい感じに出来る方法知ってる人居たら教えてください。
現状、僕が知っている方法だと、定期的にパーティションを切るLambdaを実行するという方法しか思いつかない。(それGlue使わなくていいやんという話になる)