Hadoop 在 Ubuntu 上的日志分析与排查
一 日志位置与快速查看
- 日志默认位于 $HADOOP_HOME/logs,常见文件命名包含组件名与主机名,例如:hadoop-<用户名>-namenode-<主机名>.log、hadoop-<用户名>-datanode-<主机名>.log、yarn-<用户名>-resourcemanager-<主机名>.log、yarn-<用户名>-nodemanager-<主机名>.log。进入目录后可用以下命令快速定位与跟踪:
- 查看目录:ls $HADOOP_HOME/logs
- 实时跟踪:tail -f $HADOOP_HOME/logs/hadoop--namenode-.log
- 关键字检索:grep -n “ERROR|Exception” $HADOOP_HOME/logs/hadoop--namenode-.log
- 按时间查看尾部:tail -n 200 $HADOOP_HOME/logs/hadoop--datanode-.log
- 若未设置 $HADOOP_HOME,可用实际安装路径(如 /usr/local/hadoop/logs)替代。上述路径与命令适用于单机和伪分布式环境。
二 常见报错与定位要点
- IPC 端口误用:在浏览器访问 fs.defaultFS=hdfs://localhost:9000 会报 “It looks like you are making an HTTP request to a Hadoop IPC port”。应改用 NameNode Web UI 端口(如 50070) 访问;9000 是 HDFS 的 IPC 端口,非 HTTP 接口。
- 服务未启动或异常退出:先用 jps 检查进程(应看到 NameNode、DataNode、ResourceManager、NodeManager 等),若缺失,启动相应进程并再次查看对应日志定位根因。
- 连接被拒或超时:确认进程已启动、网络与端口可达;如启用防火墙(如 ufw),放行对应 Web 端口(例如 sudo ufw allow 50070)。
- 磁盘与权限:日志中出现 No space left on device 需清理磁盘;出现 Permission denied 需检查目录与文件权限及运行用户。
三 日志格式与关键信息提取
- 典型行格式为:日期 时间 级别 类名 信息,例如:
- 2013-03-06 15:23:48,132 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: STARTUP_MSG: Starting DataNode
- 2013-03-06 15:23:58,346 INFO org.apache.hadoop.http.HttpServer: Jetty bound to port 50075
- 实战提取思路(命令行组合):
- 错误与异常快速定位:grep -E “ERROR|Exception|WARN” $HADOOP_HOME/logs/hadoop--namenode-.log | tail -n 50
- 启动与端口绑定:grep -E “STARTUP_MSG|Jetty bound to port” $HADOOP_HOME/logs/hadoop--datanode-.log
- 按时间窗口过滤(示例:2024-12-18 10 点之后):grep “2024-12-18 1[0-9]” $HADOOP_HOME/logs/hadoop--namenode-.log
- 上述格式与字段含义可直接用于编写脚本做结构化解析与告警。
四 用 Hive 对日志做统计与可视化
- 将日志落地到 HDFS:hadoop fs -mkdir -p /logs/hadoop && hadoop fs -put $HADOOP_HOME/logs/*.log /logs/hadoop
- Hive 建表(示例,按空格切分,实际请按日志格式调整):
- CREATE TABLE hadoop_logs (
log_time STRING,
level STRING,
logger STRING,
message STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ’ ’
STORED AS TEXTFILE
LOCATION ‘/logs/hadoop’;
- 常用统计示例:
- 按级别计数:SELECT level, COUNT(*) AS cnt FROM hadoop_logs GROUP BY level;
- Top 10 报错类:SELECT logger, COUNT(*) AS cnt FROM hadoop_logs WHERE level=‘ERROR’ GROUP BY logger ORDER BY cnt DESC LIMIT 10;
- 错误趋势(按小时):SELECT substr(log_time, 1, 13) AS hour, COUNT(*) AS err_cnt FROM hadoop_logs WHERE level=‘ERROR’ GROUP BY substr(log_time, 1, 13) ORDER BY hour;
- 结果可导出到 MySQL(如通过 Sqoop)后,用 ECharts 等做可视化展示。