S3のアクセスログをEMRを使って解析してみた

S3のアクセスログをEMRを使って簡単に解析してみた。
rubyのstreamingでちゃちゃっと書きました。

スクリプト

index.htmlを叩いた時のIPアドレスを抜き出すmapper
IPアドレスからドメインを判断するmapper

いろいろ試行錯誤しながら作ってたので、ごちゃごちゃしてます。TLDや汎用JPドメインだったときには後ろ2つ、それ以外は後ろ3つをドメイン名として採用。名前解決できなかったときは第三オクテットまでを取ってます。

共通で使えるreducer

使い方

$ emr --create --stream --step-name ip --input s3n://bucket/access_log --output s3n://bucket/output.tmp --mapper s3n://bucket/ip_mapper.rb --reducer s3n://bucket/reducer.rb \
--stream --step-name domain --input s3n://bucket/output.tmp --output s3n://bucket/visitor --mapper s3n://bucket/domain_mapper.rb --reducer s3n://bucket/reducer.rb  \
--log-uri s3n://bucket/logs --enable-debugging --num-instances 5 --master-instance-type m1.large --slave-instance-type m1.small

( alias emr='elastic-mapreduce -c /path/to/credentials.json' としています )

ハマった所

最初、一気にmapperでIP取り出して名前解決してたんですが、すべてのログの行に対して何回も名前の逆引きをするのが時間がかかるので、2段構成にしました。CPU使った処理より名前引く方が時間がかかるので、m1.smallで台数稼ぐ方向で。