Hadoop を使いはじめたのですが、Hadoop で出力されるログを syslog 経由で出力するように設定してみました。最初は、log4j.properties だけ書き換えればよいかと思ったのですが、これだけでは syslog 経由でログを出力できませんでした。
Hadoop は、CDH のバージョン 0.18.3 を使っています。
まず、/usr/lib/hadoop/bin/hadoop-daemon.sh で、log4j の logger 環境変数を使えるように次のように変更します。次のパッチでは、念のためローカルのログファイル名も変更できるようにしてあります。
/usr/lib/hadoop/bin/hadoop-daemon.sh
28a29,30> # HADOOP_LOGFILE The log file name. Default is hadoop-$HADOOP_IDENT_STRING-$command-$HOSTNAME.log
> # HADOOP_ROOT_LOGGER The root appender. Default is INFO,console
84a87,94
> # log configuration
> if [ "$HADOOP_LOGFILE" = "" ]; then
> export HADOOP_LOGFILE=hadoop-$HADOOP_IDENT_STRING-$command-$HOSTNAME.log
> fi
> if [ "$HADOOP_ROOT_LOGGER" = "" ]; then
> export HADOOP_ROOT_LOGGER=”INFO,DRFA”
> fi
>
86,87d95< export HADOOP_LOGFILE=hadoop-$HADOOP_IDENT_STRING-$command-$HOSTNAME.log
< export HADOOP_ROOT_LOGGER=”INFO,DRFA”
次に、/etc/hadoop/conf/hadooop-env.sh に、次のように追加します。
export HADOOP_ROOT_LOGGER=”INFO,SYSLOG,DRFA”
最後に、/etc/hadoop/conf/log4j.properties に syslog で出力するための log4j の appender を追加します。
#
# syslog
#
log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender
log4j.appender.SYSLOG.facility=local0
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSLOG.layout.ConversionPattern=%p %c{2}: %m%n
log4j.appender.SYSLOG.SyslogHost=127.0.0.1
log4j.appender.SYSLOG.threshold=INFO
log4j.appender.SYSLOG.Header=true
log4j.appender.SYSLOG.FacilityPrinting=true
あとは、Hadoop を再起動すれば、127.0.0.1 のサーバに 514 番ポート、UDP、local0 ファシリティ、にて Hadoop のログが転送されます。どうやら、TCP にすることができないみたいです。
hadoop-daemon.sh の方は、本家でバージョン 0.21 で対応予定のようです。
参考資料
Tags: hadoop






