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界面獲?。?pre class="hljs">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';