Debian下Hadoop日志管理技巧
启用YARN日志聚合功能,将分散在各节点的日志汇总到HDFS统一目录,便于集中存储和访问。需修改$HADOOP_HOME/etc/hadoop/yarn-site.xml文件,添加/修改以下配置:
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value> <!-- 启用日志聚合 -->
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/app-logs</value> <!-- HDFS上的日志存储根目录 -->
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir-suffix</name>
<value>logs</value> <!-- 日志文件后缀 -->
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>172800</value> <!-- 日志保留时间(秒),此处为2天 -->
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://<resourcemanager-host>:19888/jobhistory/logs/</value> <!-- JobHistory Server日志访问URL -->
</property>
修改完成后,重启YARN服务使配置生效:
$HADOOP_HOME/sbin/stop-yarn.sh && $HADOOP_HOME/sbin/start-yarn.sh
通过该配置,所有节点的应用日志会自动聚合到HDFS的/app-logs目录,按应用ID分类存储。
yarn logs命令,需替换<application_id>为实际应用ID(可从ResourceManager Web界面获取):yarn logs -applicationId application_1234567890000_0001 > app_log.txt
hdfs dfs命令读取HDFS中的日志文件(如NameNode日志):hdfs dfs -cat /var/log/hadoop/hadoop-*-namenode-*.log | less
grep命令快速定位错误或警告日志:grep -i "error\|warn" /var/log/hadoop/hadoop-*-datanode-*.log
http://<resourcemanager-host>:8088/cluster,点击“Applications”找到目标应用,进入“Logs” tab查看日志。http://<jobhistory-host>:19888/jobhistory,点击“Job History”找到目标作业,查看详细日志。${HADOOP_HOME}/logs目录下,文件名格式为hadoop-*-namenode.log、hadoop-*-datanode.log等。/app-logs),本地临时日志路径可通过mapred-site.xml中的mapreduce.jobhistory.intermediate-done-dir配置。编写Shell脚本定期删除本地过期日志(如保留7天),示例脚本clean_hadoop_logs.sh:
#!/bin/bash
LOG_DIR="/var/log/hadoop"
DAYS_TO_KEEP=7
find "$LOG_DIR" -name "hadoop-*.log*" -type f -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
将脚本添加到Cron每日执行:
crontab -e
添加以下内容(每日凌晨2点执行):
0 2 * * * /path/to/clean_hadoop_logs.sh
通过logrotate工具实现日志自动轮转、压缩和删除,创建/etc/logrotate.d/hadoop文件:
/var/log/hadoop/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
copytruncate
}
该配置表示:每日轮转日志,保留7个压缩文件,压缩前不等待日志为空,轮转时不中断正在写入的日志。
若需调整Hadoop组件日志级别(如DEBUG级别查看详细信息),修改$HADOOP_HOME/etc/hadoop/log4j.properties文件:
# 调整NameNode日志级别为DEBUG
log4j.logger.org.apache.hadoop.hdfs.server.namenode=DEBUG,console
# 调整DataNode日志级别为INFO(默认)
log4j.logger.org.apache.hadoop.hdfs.server.datanode=INFO,console
# 控制台输出格式
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c: %m%n
修改后重启Hadoop服务使配置生效。
将Hadoop日志导入ELK Stack(Elasticsearch+Logstash+Kibana)或Hive,实现可视化分析和深度挖掘:
LOAD DATA INPATH '/app-logs/application_1234567890000_0001/logs' INTO TABLE hadoop_logs;
SELECT COUNT(*) AS error_count FROM hadoop_logs WHERE log_level = 'ERROR';