2013年7月2日火曜日

fluent-plugin-uniqcount を用いて Fluentd で数値集計

https://github.com/KazkiMatz/fluent-plugin-uniqcount
http://d.hatena.ne.jp/kazuk_i/20130506

ログデータをFluentdで収集し、HadoopやMongoDBなどのストレージに収集した後、クエリーを発行して必要なデータを取得する。
たいていのデータ解析では上述のような後付けのバッチ処理で十分ですが、

  • 準リアルタイムで収集をしたい
  • Fluentdでリレーするデータは、当該集計以外には使用しない
    (ストレージに格納したとしても、基本的に再利用はされない)
といったケースの場合、ストレージにデータをすべて保持するのは無駄ですし、即時性の観点でもFluentdをデータが流れる際にあわせて数値集計が行われた方が効率が良いです。

記事先頭にリンクをした「fluent-plugin-uniqcount」は、名前の通リ特定の条件に合致したデータのユニーク件数について、集計が行えるFluentdプラグインです。


◯内容
詳しくは作者の方のブログに詳細な記述があるので、こちらを参照下さい。


◯事例
ある程度URLのバリエーションが固定されているとあるWebサービスで、時間単位内でURLごとにそれぞれどの程度のリクエストがあるか集計したい、という需要がありました。
1日単位での集計で十分であればログを溜めた上でHadoop(Hive)等での集計で十分なのですが、最低でも1分単位でデータを把握したかったため当該プラグインを使用しました。
access_log -- [in_tail] --> Fluentd -- [out_uniqcount] -- [out_http] --> (API Server) --> MySQL
概ねの流れは上記の通リで、in_tailで読み取ったログ情報をURLごとに集計し、out_httpを経由して最終的にMySQLに書き込みます。

out_uniqcountの設定は、たとえば以下のような形。
<match hoge.access_log>
    type uniq_count
    list1_label hoge_trends
    list1_key1 uri
    list1_key2 referer
    list1_span 60
    list1_offset 3
    list1_out_tag hoge.uniq_referer
    list1_out_num 1000
    list1_out_interval 60
</match>
上記であれば、あるuriにアクセスされたrefererごとにFluentd上で数値が集計され、1分ごとにアクセスの多い上位1000件が"hoge.uniq_referer"タグにて出力されます。

このように、色々なルールの組み合わせでFluentd上で手軽に数値集計が可能になります。

システム的なメトリクス情報の取得であれば、uriとstatus codeの組み合せで特定URLへのステータスコード別リクエスト数、なども出せます。
また、作者ブログの事例にもあるように、urlとip addressの組み合わせで集計することで特定URLの簡易ユニークアクセス数なども集計できます。


◯注意点
すべての集計データをいったんFluentdプロセスのメモリ上に保持する形になります。なので、作者のブログにも記載されていますが、データパターンが増えるとメモリが溢れてしまう可能性があります。単位時間内に大量の組み合わせが発生するような集計処理では大量のシステムリソースを必要とするので、注意です。


機能としては非常にシンプルですし、作者の意向かFluentd Pluginsのページにも公開されてませんが、現実的な性能を出してくれますし、手軽に数値集計が行えるので、データ規模が一定の範囲で収まる用途であれば有効な手法だと思います。





0 件のコメント:

コメントを投稿