はじめに
Fluentd Casual Talks #3 で norikra の作者である @tagomoris さんのお話を伺ってからずっと試したいと思っていてやっと試せたのでアウトプット。
参考
- Norikra 0.1を使ってみた
- Norikraで遊んでみた
- fluent-plugin-norikra #fluentdcasual
- Norikra in action
- http://esper.codehaus.org/
- 5.1. EPL Introduction
- 5.2. EPL Syntax
norikra とは
自分の認識、でも百聞は一見に如かず
ちゃんと理解出来ていないけど...以下のような認識でいる。
- ログ等のストリームデータを
SQL
ライクなツールを使って検索出来るツール - 例えば、
fluentd
で処理しているログに対してSQL
に似た感じの検索クエリを投げて結果を処理出来る - 入出力されるデータは
JSON
形式な為、スキーマレスで扱い易くtarget
を(他のRDB
で言うところのテーブル)作成することが出来る - Web UI が用意されていて Web 上からクエリの作成、結果等を確認することが出来る
とは言え、百聞は一見に如かず。以下の二つ資料が参考になる。
先日の Fluentd Casual Talks #3 での資料。
用語
norikra
は EPL
という SQL
ライクなクエリで処理を記述することが出来る(EPL
は Esper と呼ばれるイベントストリームを分析・処理するツールの一つで利用されているとのこと)ので、用語的には SQL
と大きな違いは無いと思われるが、以下のような特徴がある。
- テーブルを
target
と呼ぶ - テーブルのカラムを
field
と呼ぶ - クエリはまんま
query
と呼ぶ - ストリームデータやクエリの結果を
event
と呼ぶ JOIN
やサブクエリもサポートされている- 公式ページ に記述されている
SQL with window specifier support
のwindow specifier
がイマイチ理解出来ていない...(後述)
ウィンドウ(window specifier)について
SQL
ライクな EPL
の特徴の一つとして(自分は捉えている)ウィンドウ(上記の window specifier
が該当する)があるが、そのウィンドウについてドキュメントを読んだりして以下のように解釈した。また、こちらにも詳しく書かれていてとても助かった。(感謝!)
- ストリームで流れてくるデータの見る範囲(軸)をウィンドウという名前で定義
- そのウィンドウには現在からの時間、現在からの個数、単位時間毎等を定義することが出来る
- イメージとしては海沿いのマンションで異なる部屋の窓(ウィンドウ)から海を見た場合に見え方が違うよねって感じかなw
シンタックスとしては...
select hoge from ${target}.win:time(30 sec) where huga='baz'
という感じ。これだと「30
秒前のデータに関して、${targe}
から huga
が baz
なレコードの 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
単体を用いて試した)
コンテナ起動
こちらの 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/
にアクセスする。アクセスすると以下のようなページが表示される。
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 からも確認出来る。
また、コマンドラインから 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
の件数等見てみる。
おお、登録されている。
クエリを登録して結果を見る
せっかくなので WebUI からクエリを登録してみる。
クエリを登録してからもひたすら event
を投げ続けて、飽きてきたところでクエリの結果を見てみる。まずは、WebUI から。
おお。次にコマンドラインから。
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
にデータを流してみる