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.logfield_separator TAB
output_include_time true
output_include_tag true