Hadoop-CDH4.3.0にfluentd

WebHDFSを入れたのはfluentdを使うためだったのですが,fluentdはご覧のように依存があるので

gem install fluentd
ERROR:  While executing gem ... (Gem::DependencyError)
    Unable to resolve dependencies: fluentd requires msgpack (!= 0.5.0, != 0.5.1, != 0.5.2, != 0.5.3, < 0.6.0, >= 0.4.4), yajl-ruby (~> 1.0), cool.io (~> 1.1.0), http_parser.rb (~> 0.5.1)

gemでMessagePackとyajlとcool.ioとhttp_parser.rbを入れておきます.
通常,サックリいくはずですが,私はネットワークに繋がらないサーバ上で作業をしたので,なかなか苦労しました.

例えば,MessagePackなら,ソースを落としてきて

https://github.com/msgpack/msgpack-ruby/archive/master.zip
unzip master.zip
cd msgpack-ruby-master
cd lib
cp -pv * /usr/local/lib/ruby/site_ruby/2.0.0/
cd ../ext/msgpack
ruby extconf.rb
make
cp -pv msgpack.so /usr/local/lib/ruby/site_ruby/2.0.0/msgpack

とか...
http_parser.rbは,https://rubygems.org/downloads/http_parser.rb-0.5.3.gemでgemに固めたファイルが落ちてきたので,

gem install http_parser.rb-0.5.3.gem --local

で入れました.
yajlとcool.ioは,下から落としてきて
https://github.com/brianmario/yajl-ruby/archive/master.zip
https://github.com/tarcieri/cool.io/archive/master.zip
ext/はmakeしてコピー,lib/はコピーして入れました.

fluentdもgemで依存ライブらいを入れなかったせいか依存関係を認識せず...下から落としてきてコピーでインストールしました.
https://github.com/fluent/fluentd/archive/master.zip

WebHDFS用のプラグインも落としてきて無理やりコピー.
https://github.com/fluent/fluent-plugin-webhdfs

ええい.まだまだありやがる.

https://github.com/kzk/webhdfs

cd webhdfs-master/lib
cp -pvr * /usr/local/lib/ruby/site_ruby/2.0.0/

https://github.com/tagomoris/fluent-mixin-config-placeholders

cd fluent-mixin-config-placeholders-master/lib/fluent
cp -pvr mixin /usr/local/lib/ruby/site_ruby/2.0.0/fluent/

https://github.com/tagomoris/fluent-mixin-plaintextformatter

cd fluent-mixin-plaintextformatter-master
/usr/local/lib/ruby/site_ruby/2.0.0/fluent/mixin/

https://github.com/condor/ltsv

cd ltsv-master
cp -pv lib/ltsv.rb /usr/local/lib/ruby/site_ruby/2.0.0/

https://github.com/sporkmonger/uuidtools

cd uuidtools-master/lib
cp -pvr * /usr/local/lib/ruby/site_ruby/2.0.0/

そしてドキュメント通りにfluentdを立ちあげてテスト...

$ echo '{"json":"message"}' | fluent-cat debug.test                                                                       
2013-07-03 18:58:43 +0900 debug.test: {"json":"message"}
$ curl -X POST -d 'json={"action":"login","user":2}' http://localhost:8888/access.test
$ hdfs dfs -ls /tmp
Found 1 items
drwx------   - hadoop supergroup          0 2013-06-12 17:52 /tmp/hadoop-yarn

あれ?ログが無い?

と思ったらfluentdからメッセージが出ていて,

2013-07-04 12:03:04 +0900 [warn]: failed to communicate hdfs cluster, path: /tmp/access.log.20130703_19.log
2013-07-04 12:03:04 +0900 [warn]: before_shutdown failed error="{\"RemoteException\":{\"exception\":\"AccessControlException\",\"javaClassName\":\"org.apache.hadoop.security.AccessControlException\",\"message\":\"Permission denied: user=dr.who, access=EXECUTE, inode=\\\"/tmp\\\":hadoop:supergroup:drw-rw-rw-\"}}"


最初からHadoopユーザで全部実行すれば良かったカモですね.
今回は,/tmp何てのは誰でも読み書き出来て良い気がするので,パーミッションを書き換えました.

$ hdfs dfs -chmod 777 /tmp

そしてcurlしてkill -USR1でフラッシュしてみると,ファイルが落ちてました.HDFS上に.

$ hdfs dfs -ls /tmp
Found 2 items
-rw-r--r--   3 dr.who supergroup         61 2013-07-04 12:06 /tmp/access.log.20130704_12.log
drwx------   - hadoop supergroup          0 2013-06-12 17:52 /tmp/hadoop-yarn

$ hdfs dfs -text /tmp/access.log.20130704_12.log
2013-07-04T03:05:36Z    access.test     {"action":"login","user":2}

fluent.confで書き換えたのは,これくらいです.

fluent.conf

type webhdfs
host namenode.example.com
port 50070
path /tmp/access.log.%Y%m%d_%H.log

field_separator TAB
output_include_time true
output_include_tag true