これなら使える!ビッグデータ分析基盤のエコシステム

第2回 ストリーミング処理とバッチ処理によるデータ収集 ~ Fluentd編 ~

この記事を読むのに必要な時間:およそ 7.5 分

データの種類と頻度に合わせたデータ収集方法

データ分析を行っていく上で,データ収集を行うことは非常に時間がかかる作業です。たとえば,ログデータはサーバの数だけ散在しているだけでなく,アプリケーションごとにログのフォーマットが異なるということも往々にしてあります。また,外部サービスと連携している場合やデータベースに保存されているデータのように,定期的にダンプされたCSVファイルを収集するケースもあります。

こうした多種多様なデータを横断的に分析するためには,これらのデータを1つの場所に集計しやすい形で収集する必要があります。

このようなケースにおいて,データ収集を発生頻度によってストリーミング処理とバッチ処理の2つの方法に分けることで対応することができます。

ストリーミング処理では,Webサーバのアクセスログやセンサーデータなどのリアルタイムに生成されるデータを対象とします。そのために適したツールとしてFluentdを利用します。バッチ処理では,RDBに格納されるマスターデータや外部サービスからFTPなどで定期的に送られてくるデータを定期的に転送する必要があるデータを対象とします。このために適したツールとしてEmbulkを利用します。

図1 データ収集システムの概要

図1 データ収集システムの概要

今回と次回で,FluentdとEmbulkのインストールから分析エンジンに収集するまでの流れを紹介していきます。

Fluentdでアクセスログをストリーミングで収集する

Fluentdとは

Fluentdとは,米トレジャーデータ社が中心となり,オープンソースとして開発を行っているログコレクタです。特徴として,スキーマレスであること,データ入出力加工がプラグイン機構であること,バッファリングの機構によって信頼性の高いログ転送の仕組みになっていること,という点が挙げられます

Fluentdのインストール

Fluentdを使うためには,下記のソフトウェアのいずれかをインストールすることによって実現できます。ここでは,Rubyやそのライブラリの依存関係を考慮したパッケージのtd-agent2を使ってインストールを行います。

Fluentd
Rubyのパッケージ管理システムのRubyGemsで配布をされており,最新版や独自Rubyバージョンで利用したい場合にはこちらを利用します。
td-agent
米トレジャーデータ社によって,依存関係を考慮してパッケージングされており,基本的にはtd-agentをインストールするのが一番簡単です。また,現在のところ下記の2種類が提供されています。
td-agent1
Ruby1.9系でパッケージングされたバージョンです。Ruby1.9系の修正・サポートの提供が停止したため,td-agent1もセキュリティフィクスのみの提供となっています。
td-agent2
Ruby2.1系でパッケージングされたバージョンです。現在の安定版となっているため,通常はこちらを利用してください。

さて,それでは下記のインストールスクリプトを実行してみましょう。2015/07/23時点ではtd-agent2.2.1が最新版となっており,今回の利用環境としてはUbuntu14.04を利用しています。

$ curl -L https://td-toolbelt.herokuapp.com/sh/install-ubuntu-trusty-td-agent2.sh | sh

アクセスログのフォーマット

Fluentdをインストールして,ログを収集する準備はできました。さて,それでは対象となるアクセスログについて考えてみましょう。

一般的に,Apacheのアクセスログは下記のフォーマットでログ出力されています。

Apacheアクセスログの標準フォーマット

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

表1 Apacheアクセスログの標準フォーマット

Format String説明
%hリクエストしたリモートホスト名
%lリモートユーザ名
%u認証に使用されたリモートユーザ
%tリクエストを受けた時刻
%rHTTPリクエストヘッダ
%>sサーバがリクエストに対して返したステータスコード
%bHTTPヘッダを除いた転送バイト数
%{Referer}iRefererヘッダの内容
%{User-Agent}iUser-Agentヘッダの内容

しかし,表1を見たときに,Webサイトにアクセスするユーザを一意に特定できるかについて考えると,情報が不足していることがわかります。上記データの場合には,基本KPIの分析はある程度可能ですが,ユーザごとのWebサイト上のパスを見る応用KPIの分析を行うには難しいことが考えられます。そこで,アクセスログの中にクッキーIDなどのユーザを一意に取得するための情報を入れておくことで応用KPIの分析にたどり着くことが可能です。

クッキーIDを設定するためのApacheのログを生成するためには,Apacheのusertrack_moduleを使うことで今回は実現しています。そして,このクッキー情報をログフォーマットに追加します。

また合わせて,デフォルトのApacheのログフォーマットは可読性がよくなく,任意のパラメータを入れた際に,ログをパースすることが煩雑になりがちです。そこで,LTSV(Labeled Tab-separated Values)形式にしておきます。LTSV形式ではカラム名とその値がセットになって扱われ,delimiterとしてはタブがデフォルトで利用されます。

これらの設定を実現するためには,Apacheのログ出力のフォーマットとして下記を設定します。

TSV形式に対応したアクセスログのフォーマット

"time:%{%Y-%m-%d %H:%M:%S %z}t\tdomain:%V\thost:%h\tserver:%A\tident:%l\tuser:%u\tmethod:%m\tpath:%U%q\tprotocol:%H\tstatus:%>s\tsize:%b\treferer:%{Referer}i\tagent:%{User-Agent}i\tresponse_time:%D\tcookie:%{cookie}i\tset_cookie:%{Set-Cookie}o" ltsv

表2 識別情報を加えLTSV形式に対応したアクセスログのフォーマット

項目名 Format String 説明
domain %V Hostヘッダの内容
host %h リクエストしたリモートホスト名
server %A 応答を返したサーバのローカルIPアドレス
ident %l リモートユーザ名
user %u 認証に使用されたリモートユーザー名
time %{%Y-%m-%d %H:%M:%S %z}t リクエストを受けた時刻
method %m リクエストメソッド
path %U%q REQUEST_URI
protocol %H リクエストプロトコル
status %>s サーバがリクエストに対して返したステータスコード
size %b HTTPヘッダを除いた転送バイト数
referer %{Referer}i Refererヘッダの内容
agent %{User-Agent}i User-Agentヘッダの内容
response_time %D リクエストを処理するのにかかった時間,マイクロ秒単位
cookie %{cookie}i サーバが受信したクッキー
set_cookie %{Set-Cookie}o サーバが送出したクッキー

上記のパラメータを元に生成されたログは下記のようになります。

変更後のアクセスログ

time:2015-07-26 08:58:20 +0000  domain:52.69.91.201 host:153.232.253.97 server:172.31.6.70  
ident:- user:-  method:GET  path:/index.html    protocol:HTTP/1.1   status:200  size:3256   
referer:-   agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/600.7.12 (KHTML, like Gecko) Version/8.0.7 Safari/600.7.12    
response_time:795   cookie:-    set_cookie:Apache=2a4375d6.51bc3704b915f; path=/; expires=Tue, 25-Jul-17 08:58:20 GMT

アクセスログ(LTSV形式)を集める

ここまでの説明でApacheのアクセスログをLTSV形式で/var/log/apache2/access.logに出力するようにしました。そこで,FluentdでLTSV形式のログを収集してみます。読み込んだファイルは,テストとして標準出力に出力しておきます。

LTSV形式のログを収集するためのFluentdの設定

<source>
  @type tail
  path /var/log/apache2/access.log
  pos_file /var/log/td-agent/access.log.pos
  tag apache.access
  format ltsv
  time_key time
  read_from_head
</source>

<match apache.access>
  @type stdout
</match>

設定ファイルを/etc/log/td-agent.confに配置し,td-agentを起動します。

$ service td-agent start

すると,td-agentのログ(/var/log/td-agent/td-agent.log)には下記が出力されます。

td-agentで収集されたログ

2015-07-26 17:58:20 +0900 apache.access: {"domain":"52.69.91.201",
"host":"153.232.253.97","server":"172.31.6.70",
"ident":"-","user":"-","method":"GET",
"path":"/index.html","protocol":"HTTP/1.1",
"status":"200","size":"3256","referer":"-",
"agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/600.7.12 (KHTML, like Gecko) Version/8.0.7 Safari/600.7.12",
"response_time":"795","cookie":"-","set_cookie":"Apache=2a4375d6.51bc3704b915f; path=/; expires=Tue, 25-Jul-17 08:58:20 GMT"}
2015-07-26 17:58:21 +0900 apache.access: {"domain":"52.69.91.201",
"host":"153.232.253.97","server":"172.31.6.70",
"ident":"-","user":"-","method":"GET",
"path":"/index.html","protocol":"HTTP/1.1",
"status":"200","size":"3256","referer":"-",
"agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/600.7.12 (KHTML, like Gecko) Version/8.0.7 Safari/600.7.12",
"response_time":"670","cookie":"Apache=2a4375d6.51bc3704b915f","set_cookie":"-"}

著者プロフィール

高橋達(たかはしとおる)

Treasure Data Inc.でテクニカルサポートエンジニアとして,毎日,日米問わず顧客のサポートを担当。サポートエンジニアのエンジニアとしての地位向上を目指して色々模索中。そのために,秋葉原幻橙館で今日も元気にOSS活動を行っている。

URL:http://toru-takahashi.gitbooks.io/secret-ninja/content/

コメント

コメントの記入