読者です 読者をやめる 読者になる 読者になる

fluent-plugin-histogram released.

fluent-plugin-histogramというfluentdのプラグインを書きました。

fluent-plugin-histogram - RubyGems

fluent-plugin-histogram

入力データの指定したkeyの値についてカウントして、ヒストグラム的な何かを作ります。

使い方は以下です。

<match input.**>
    type            histogram
    count_key       keys       # カウントするkeyを指定
    flush_interval  10s        # flush interval[s] (デフォルト 60s)
    tag_prefix      histo
    tag_suffix      __HOSTNAME__    # fluent-mixin-config-placeholders をmixinしてます。ありがたや。
    input_tag_remove_prefix input
    alpha           1           # 曖昧さ
           #                             ■    
           #                  ■        ■ ■ ■
           #          ■     ■ ■ ■    ■ ■ ■ ■ ■
           # alpha:   0,      1,         2

    bin_num            100           # ビンの個数
</match>


上の設定で例えば、こんな入力をすると、

$ echo '{"keys":["A",  "B",  "C",  "A"]}' | fluent-cat input.sample
$ echo '{"keys":["A",  "B",  "D"]}' | fluent-cat input.sample
2013-12-21T11:08:25+09:00       histo.sample.localhost   {"hist":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 2, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0], "sum":28, "avg":0, "sd":0}

こんなヒストグラム的な何かを出力します。
出力データには、histキーの値のsum,avgとsd(標準偏差)がつきます。

ここでヒストグラム的な何かと書いたのは、このプラグインが作るヒストグラムとは、どれだけ多くの種類のkeyがあっても、固定サイズのビンの個数で、さらにalphaで指定した範囲をカウントアップするというヒストグラム的な何かだからです。なので、正確なヒストグラムを求めたいときには使えません。膨大な種類のkeyがあって、でそのkeyの偏りとかがきになる時に使用するものとして作りました。例えば、HadoopでWordCountする時の、mapタスクへの入力スプリットの偏りが知りたいとか。
ビンの個数が固定のためkeyのマッピングの際に雑音が発生するんですが、そのときにalphaが効いてきます。キーワードとしては、Rough Histogramなんかがあります。


あとは、単位時間のデータ数が多くこのプラグインの処理の負荷が大きいときなんかは、サンプリングレートを設定することができます。

<match input.**>
    ...
    # サンプリングレート。入力データの 1/10をカウント
    sampling_rate   10              
    ...
</match>


!

これでデータの偏りが得られます。
あとは適当に可視化、cubism.jsなどを使ってグラフを描けばホットスポットの検出とかに役立ちます。


© karahiyo