历史服务器

Hadoop 历史服务器:作业跑完就消失?用它找回来

YARN Web UI 只能看到当前正在跑的作业。作业一旦完成,它就消失了——你看不到它跑了多久、占了多少资源、失败了为什么失败。

这就是历史服务器解决的问题:把已完成作业的日志和统计信息保存下来,方便事后追溯。

它只存 MapReduce 作业。Spark 有 Spark History Server,Flink 有 Flink History Server,各管各的。

历史服务器

核心配置:改两个文件

文件1:mapred-site.xml——历史服务器自己

<!-- RPC 通信地址 -->
<property>
  <name>mapreduce.jobhistory.address</name>
  <value>hadoop1:10020</value>
</property>

<!-- Web UI 地址 -->
<property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>hadoop1:19888</value>
</property>

<!-- 作业运行时临时日志目录 -->
<property>
  <name>mapreduce.jobhistory.intermediate-done-dir</name>
  <value>/mr-history/tmp</value>
</property>

<!-- 作业完成后归档日志目录 -->
<property>
  <name>mapreduce.jobhistory.done-dir</name>
  <value>/mr-history/done</value>
</property>

hadoop1 换成你实际部署历史服务器的那台机器的主机名。

文件2:yarn-site.xml——让 YARN Web UI 能跳转过来

<configuration>  
  <!-- 配置历史服务器地址,用于 YARN Web UI 跳转 -->  
  <property>  
    <name>yarn.log.server.url</name>  
    <value>http://hadoop1:19888/jobhistory/logs</value> <!-- 与历史服务器 Web UI 地址对应 -->  
  </property>  
</configuration>

这条配置让 YARN Web UI 里的 “History” 链接能跳转到历史服务器。

创建 HDFS 目录

历史日志存 HDFS,先建好目录、给权限:

hdfs dfs -mkdir -p /mr-history/tmp
hdfs dfs -mkdir -p /mr-history/done
hdfs dfs -chmod -R 777 /mr-history

启动和验证

启动:

mapred --daemon start historyserver

验证进程:

jps
# 应该能看到 JobHistoryServer

验证 Web UI:

浏览器打开 http://hadoop1:19888,能看到已完成作业列表。

验证 YARN 跳转:

去 YARN Web UI(http://<RM节点>:8088),找个已完成的作业,点 “History” 链接,能跳转到历史服务器页面说明配置成功。

怎么查历史日志

方式1:Web UI

  • 打开 http://hadoop1:19888
  • 点击作业 ID 看概览(启动时间、完成时间、Map/Reduce 数量)
  • 点 “Maps” 或 “Reduces” 看具体任务的 stdout/stderr
  • 点 “Counters” 看计数器(输入记录数、输出记录数等)

方式2:命令行

# 查看作业概况
mapred job -history application_xxx_xxx

# 查看完整信息(包括任务详情)
mapred job -history all application_xxx_xxx

工作原理

作业运行中
    ↓
日志写到 HDFS 临时目录(/mr-history/tmp)
    ↓
作业完成
    ↓
历史服务器把日志从临时目录移到归档目录(/mr-history/done)
    ↓
用户通过 Web UI 或命令行查询

关键点:日志是作业运行时实时写的,不是作业完成后再收集的。 所以历史服务器必须提前启动,作业提交时它就得在。

常见问题

1. YARN Web UI 的 “History” 链接点不了或跳错

检查 yarn-site.xml 里的 yarn.log.server.url 是否配置正确,是不是能访问 http://hadoop1:19888

2. 历史服务器启动了,但看不到历史作业

历史服务器只记录它启动之后才完成的作业。如果是启动之前就跑完的作业,它没有记录。

3. HDFS 目录权限不足导致日志写不进去

检查 /mr-history/tmp/mr-history/done 的权限,确保运行 MapReduce 的用户有写权限。

4. 历史服务器内存不够

mapred-env.sh 里调大堆内存:

export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=2048

5. 历史服务器关闭

mapred --daemon stop historyserver