ようへいの日々精進XP

よかろうもん

norikra を試す(1)

はじめに

Fluentd Casual Talks #3norikra の作者である @tagomoris さんのお話を伺ってからずっと試したいと思っていてやっと試せたのでアウトプット。


参考


norikra とは

自分の認識、でも百聞は一見に如かず

ちゃんと理解出来ていないけど...以下のような認識でいる。

  • ログ等のストリームデータを SQL ライクなツールを使って検索出来るツール
  • 例えば、fluentd で処理しているログに対して SQL に似た感じの検索クエリを投げて結果を処理出来る
  • 入出力されるデータは JSON 形式な為、スキーマレスで扱い易く target を(他の RDB で言うところのテーブル)作成することが出来る
  • Web UI が用意されていて Web 上からクエリの作成、結果等を確認することが出来る

とは言え、百聞は一見に如かず。以下の二つ資料が参考になる。

先日の Fluentd Casual Talks #3 での資料。

用語

norikraEPL という SQL ライクなクエリで処理を記述することが出来る(EPLEsper と呼ばれるイベントストリームを分析・処理するツールの一つで利用されているとのこと)ので、用語的には SQL と大きな違いは無いと思われるが、以下のような特徴がある。

  • テーブルを target と呼ぶ
  • テーブルのカラムを field と呼ぶ
  • クエリはまんま query と呼ぶ
  • ストリームデータやクエリの結果を event と呼ぶ
  • JOIN やサブクエリもサポートされている
  • 公式ページ に記述されている SQL with window specifier supportwindow specifier がイマイチ理解出来ていない...(後述)

ウィンドウ(window specifier)について

SQL ライクな EPL の特徴の一つとして(自分は捉えている)ウィンドウ(上記の window specifier が該当する)があるが、そのウィンドウについてドキュメントを読んだりして以下のように解釈した。また、こちらにも詳しく書かれていてとても助かった。(感謝!)

  • ストリームで流れてくるデータの見る範囲(軸)をウィンドウという名前で定義
  • そのウィンドウには現在からの時間、現在からの個数、単位時間毎等を定義することが出来る
  • イメージとしては海沿いのマンションで異なる部屋の窓(ウィンドウ)から海を見た場合に見え方が違うよねって感じかなw

シンタックスとしては...

select hoge from ${target}.win:time(30 sec) where huga='baz'

という感じ。これだと「30 秒前のデータに関して、${targe} から hugabaz なレコードの hoga を取り出せ」ということになる(と思う)。尚、ウィンドウには以下のような view がデフォルトで定義されている。

win:length, win:length_batch, win:time, win:time_batch, win:time_length_batch, win:time_accum, win:ext_timed, win:ext_timed_batch, ext:sort, ext:rank, ext:time_order, std:unique, std:groupwin, std:lastevent, std:firstevent, std:firstunique, win:firstlength, win:firsttime

また、デフォルト以外に自作も出来るようなことがドキュメントには記載されている。


norikra を起動して Web UI にアクセスする

試す環境は docker で構築した。Dockerfileこちらを使った。試す環境は下記のようなイメージ。(※今回の記事では norikra 単体を用いて試した)

f:id:inokara:20131229040430p:plain

コンテナ起動

こちらDockerfile でコンテナを作成して起動する。コンテナ名は適宜、環境に応じて読み替えること。

docker run -i -t inokappa/norikra-test /bin/bash

ちなみに、以下のように起動すると norikra start まで行ったコンテナが立ち上がるのでサクッと試すには良いかもしれない。(但し、コンソールへのアクセスが出来ないので注意する。)

docker run -d inokappa/norikra-test

norikra 起動

コンテナにログインし、以下のようにして norikra を起動する。

export PATH=$PATH:/usr/local/jruby/bin
norikra start

起動すると以下のようなメッセージが出力される。

2013-12-28 19:12:56 +0000 [INFO] : thread configurations, engine:{:inbound=>{:threads=>0, :capacity=>0}, :outbound=>{:threads=>0, :capacity=>0}, :route_exec=>{:threads=>0, :capacity=>0}, :timer_exec=>{:threads=>0, :capacity=>0}}, rpc:{:threads=>2}, web:{:threads=>2}
2013-12-28 19:12:56 +0000 [INFO] : logging configurations, level:nil, dir:nil, filesize:nil, backups:nil
2013-12-28 19:12:56 +0000 [INFO] : Loading UDF plugins
2013-12-28 19:12:56 +0000 [INFO] : RPC server 0.0.0.0:26571, 2 threads
2013-12-28 19:12:56 +0000 [INFO] : WebUI server 0.0.0.0:26578, 2 threads
2013-12-28 19:12:56 +0000 [INFO] : Norikra server started.

Web UI へアクセスする

norikra の起動を確認したらブラウザで http://${コンテナ_IP}:26578/ にアクセスする。アクセスすると以下のようなページが表示される。

f:id:inokara:20131229041818p:plain


norikra を利用してみる

norikra を単体で利用してみる。その為には norikra-client が用意されているのでこちらで色々と操作してみる。

Commands:
  norikra-client event CMD ...ARGS   # send/fetch events
  norikra-client field CMD ...ARGS   # manage target field/datatype definitions
  norikra-client help [COMMAND]      # Describe available commands or one spe...
  norikra-client query CMD ...ARGS   # manage queries
  norikra-client target CMD ...ARGS  # manage targets

Options:
  [--host=HOST]
                 # Default: localhost
  [--port=N]
                 # Default: 26571

上記は norikra-client のヘルプ。

target を作成する

以下のようにして target を作成する。

norikra-client target open hogehuga f1:string f2:string f3:string

実行すると以下のようなレスポンスが表示される。

2013-12-28 20:25:19 +0000 [INFO] : opening target, target:"hogehuga", fields:{"f1"=>"string", "f2"=>"string", "f3"=>"string"}, auto_field:true

ちなみに WebUI からも確認出来る。

f:id:inokara:20131229052824p:plain

また、コマンドラインから target の一覧は以下のようにして確認する。

norikra-client target list

上記を実行すると以下のように target の一覧を確認することが出来る。

TARGET  AUTO_FIELD
hogehuga        true
1 targets found.

target に event を送信してみる

上記で作成した target に対して event(ログ)を以下のようにして送信する。

echo '{"f1":"a", "f2":"b", "f3":"c"}' | norikra-client event send hogehuga

バンバン event をひとしきり送ったら WebUI から登録された event の件数等見てみる。

f:id:inokara:20131229054044p:plain

おお、登録されている。

クエリを登録して結果を見る

せっかくなので WebUI からクエリを登録してみる。

f:id:inokara:20131229055049p:plain

クエリを登録してからもひたすら event を投げ続けて、飽きてきたところでクエリの結果を見てみる。まずは、WebUI から。

f:id:inokara:20131229055324p:plain

おお。次にコマンドラインから。

norikra-client event fetch test

ちなみに test は WebUI で作成してクエリの名前。以下のような結果が出力される。

{"time":"2013/12/28 20:37:39","count(*)":1}
{"time":"2013/12/28 20:38:14","count(*)":2}
{"time":"2013/12/28 20:38:20","count(*)":3}
{"time":"2013/12/28 20:42:34","count(*)":4}
{"time":"2013/12/28 20:42:40","count(*)":5}
{"time":"2013/12/28 20:42:45","count(*)":6}
{"time":"2013/12/28 20:47:34","f1":"a","f2":"b","f3":"c"}
{"time":"2013/12/28 20:47:39","f1":"a","f2":"b","f3":"c"}
{"time":"2013/12/28 20:47:45","f1":"a","f2":"b","f3":"c"}
{"time":"2013/12/28 20:47:50","f1":"a","f2":"b","f3":"c"}

おお。


最後に

  • 念願の norikra を利用することが出来て嬉しかった
  • 当初はストリームデータに対して SQL を投げるということに対してイメージが湧きづらかったが使っているうちにイメージが掴めた気がする
  • 確かにログをリアルタイムに処理して見たいというニーズはありそうなので引き続き使っていく
  • 但し、EPL のクエリに関してはまだまだ資料の読み込みや学習が必要(個人比)
  • ということで td-agent から norikraデータを流してみる