Hadoop実践シリーズの続きで、地味ながら重要な所をいきます。
CDH4+YARNの運用において、どのログを見れば良いのか、ログレベルはどのように設定するのか、というなんとも痒いところに手が届く孫の手編となります。
はじめに
本件に関連して、前回の外道式設定を若干更新してあります
ここではログレベルをWARNとしています
各ノードのログ
デーモンとしてのログで、HDFSとYARNに分かれてます。
ログ保存パス
/etc/hadoop/conf/hadoop-env.sh
|
export HADOOP_LOG_DIR=/data/hadoop/log |
/etc/hadoop/conf/yarn-env.sh
|
export YARN_LOG_DIR=/data/hadoop/log |
この下に、システム名やホスト名を含むファイル名ができます。
ログレベル
ノードでは log4j.properties の hadoop.root.logger ではなくこちらを使うようですが・・・
/etc/hadoop/conf/hadoop-env.sh
|
export HADOOP_ROOT_LOGGER="WARN,RFA" |
/etc/hadoop/conf/yarn-env.sh
|
export YARN_ROOT_LOGGER="WARN,RFA" |
他のどのシステムがどちらを使うかわからないので両方設定しておくべきです。
/etc/hadoop/conf/log4j.properties
|
hadoop.root.logger=WARN,console log4j.threshold=WARN |
propertiesじゃなくxmlならこうですね。
/etc/hadoop/conf/log4j.xml
|
<filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="levelMin" value="WARN"/> <param name="levelMax" value="FATAL"/> <param name="acceptOnMatch" value="true"/> </filter> |
RFAなどのFilterについては過去記事参照で。
アプリケーション実行時の全設定ログ
色んな設定があるので、ジョブは結局どのような設定の元に実行されたのか、をはっきり知っておきたい場合があります。
hive> SET -v; でもある程度出ますが全ては出ないので、このログを確認するとよいです。
ログ保存パス
/etc/hadoop/conf/mapred-site.xml
|
<property> <name>mapreduce.jobhistory.done-dir</name> <value>/mr-history/done</value> <description> Directory where history files are managed by the MR JobHistory Server. </description> </property> |
これで例えばこのような日時やジョブIDを含んだパスに設定XMLが保存されます。
/mr-history/done/2012/09/07/000025/job_1342083737352_25270_conf.xml
アプリケーション実行中の混合ログ
Map, Reduce, ApplicationMaster と、いわゆるContainerのログを保存できます。
ログ保存パス
yarn.log-aggregation-enable はデフォルト false で、その場合は一切このログは保存されません。
/etc/hadoop/conf/yarn-site.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
<property> <name>yarn.log-aggregation-enable</name> <value>true</value> <description> 集約ログを保存するかどうか。 集約ログはMAP/REDUCE/ApplicationMasterなど様々な内容が 1ディレクトリ内にホスト毎ファイルとなって保存される。 </description> </property> <property> <name>yarn.nodemanager.remote-app-log-dir</name> <value>/yarn/app-logs/</value> <description> 集約ログのHDFS保存パス。この下はユーザで区切られる。 </description> </property> |
ログは例えばこのような、ユーザ名・ジョブID・実行したSLAVEサーバのホスト名などを含んだパスに保存されます。
/yarn/app-logs/username/logs/application_1342083737352_0004/hostname-of-slave_36367
ログレベル
このログはデフォルトでINFOなので、本番だとかなりの量になってしまいます。WARNだけでもかなり多いです。
Map/Reduce
まずMapReduceのログを抑制します。この設定はジョブを実行するクライアントに必要で、編集後のジョブにそのまま反映されます。
/etc/hadoop/conf/mapred-site.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
<property> <name>mapreduce.map.log.level</name> <value>WARN</value> <description> Mapが出すログの保存ログレベル。 yarn.log-aggregation-enable が有効な場合に yarn.nodemanager.remote-app-log-dir に保存される。 </description> </property> <property> <name>mapreduce.reduce.log.level</name> <value>WARN</value> <description> Reduceが出すログの保存ログレベル。 以下同上。 </description> </property> |
ApplicationMaster
次にApplicationMasterのログを抑制します。この設定は新規ファイルを利用するようになっていて発見に苦労しました。ジョブ実行時にSLAVEサーバでプロセスを表示させるとApplicationMasterはこのような感じになっていて、container-log4j.properties を見るようになっていることがわかります。
|
/bin/bash -c /usr/lib/jvm/java-6-sun/bin/java -Dlog4j.configuration=container-log4j.properties -Dyarn.app.mapreduce.container.log.dir=/disk/1/yarn/logs/application_1346924327326_0002/container_1346924327326_0002_01_000001 -Dyarn.app.mapreduce.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Xmx1024m org.apache.hadoop.mapreduce.v2.app.MRAppMaster 1>/disk/1/yarn/logs/application_1346924327326_0002/container_1346924327326_0002_01_000001/stdout 2>/disk/1/yarn/logs/application_1346924327326_0002/container_1346924327326_0002_01_000001/stderr /usr/lib/jvm/java-6-sun/bin/java -Dlog4j.configuration=container-log4j.properties -Dyarn.app.mapreduce.container.log.dir=/disk/1/yarn/logs/application_1346924327326_0002/container_1346924327326_0002_01_000001 -Dyarn.app.mapreduce.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Xmx1024m org.apache.hadoop.mapreduce.v2.app.MRAppMaster |
なので新しくContainer用のログ設定ファイルを用意します。SLAVEサーバで必要とし、ノードの再起動はしなくとも次のジョブから反映されます。
/etc/hadoop/conf/container-log4j.properties
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
# Define some default values that can be overridden by system properties hadoop.root.logger=WARN,CLA # Define the root logger to the system property "hadoop.root.logger". log4j.rootLogger=${hadoop.root.logger}, EventCounter # Logging Threshold log4j.threshold=WARN # # ContainerLog Appender # yarn.app.mapreduce.container.log.dir=null yarn.app.mapreduce.container.log.filesize=100 log4j.appender.CLA=org.apache.hadoop.yarn.ContainerLogAppender log4j.appender.CLA.containerLogDir=${yarn.app.mapreduce.container.log.dir} log4j.appender.CLA.totalLogFileSize=${yarn.app.mapreduce.container.log.filesize} log4j.appender.CLA.layout=org.apache.log4j.PatternLayout log4j.appender.CLA.layout.ConversionPattern=%d{ISO8601} %p [%t] %c: %m%n # # Event Counter Appender # log4j.appender.EventCounter=org.apache.hadoop.log.metrics.EventCounter |
この集約ログは、ジョブが全て終わってレスポンスが返った後にまとめてHDFSに書き込まれます。
設定が hdfs/yarn, env.sh, site.xml, log4j と散らばっていて、保存先もローカルファイル, HDFSとあって正直めんどくさかったですが、ログは大事なのでちゃんと頑張ってみました。
CDH4を扱う『斬新なブログ』の名をほしいままにするための闘いは果てしないのであった・・・