1. 为什么需要 History Server
在生产环境中,我们常遇到这样的困境:一旦集群关闭,Web UI 上的作业页面就消失了,再也无法回看 DAG 图、算子指标、异常堆栈或当时的配置信息。这时候,History Server 的价值就体现出来了。
它不仅能展示 JobManager 归档下来的已完成作业状态,还能提供统一的'历史作业'入口,方便上线前后对比或参数变更复盘。更重要的是,它支持对接外部系统,通过 API 拉取作业归档数据,满足监控、运维或审计平台的需求。
2. 核心工作机制
整个链路其实很清晰:JobManager 负责'归档',History Server 负责'展示'。
当作业结束时,JobManager 会把归档信息写入文件系统目录(可以是 HDFS 或对象存储)。History Server 作为独立进程,定期轮询这个目录,发现新归档就下载到本地缓存,然后对外提供 Web UI 和 REST API 查询。
这里有个关键点:归档目录必须是共享文件系统。如果用对象存储(如 S3/OSS/GCS/Azure),记得提前安装对应的 Flink filesystem 插件。
3. 启停方式与默认端口
History Server 目前只能以 standalone 方式运行,用脚本管理即可:
# 启动或停止 HistoryServer
bin/historyserver.sh start|start-foreground|stop
默认绑定 localhost,监听端口是 8082。
4. 核心配置:两端都要配
4.1 JobManager 侧:指定归档位置
在 Flink 配置文件中设置归档目录,作业结束后会自动上传到这里:
# Directory to upload completed job information
jobmanager.archive.fs.dir: hdfs:///completed-jobs
4.2 History Server 侧:监控与缓存
History Server 需要知道去哪里找文件,以及缓存在哪:
# Monitor the following directories for completed jobs
historyserver.archive.fs.dir: hdfs:///completed-jobs
# Refresh every 10 seconds
historyserver.archive.fs.refresh-interval: 10000
# Local cache directory for downloaded archives
historyserver.web.tmpdir: /path/to/local/tmpdir
注意:
historyserver.archive.fs.dir支持逗号分隔多个目录,适合多集群汇总。refresh-interval太小会增加 FS 压力,太大则历史作业更新慢,一般 10s~60s 根据规模调整。web.tmpdir是本地缓存,归档多了容易膨胀,要注意磁盘清理策略。
5. 日志集成:打通排障闭环
Flink 本身不归档日志,但 History Server 可以生成日志 URL 模板,点击直接跳转到你们已有的日志系统:
# HistoryServer will replace <jobid> with the relevant job id
historyserver.log.jobmanager.url-pattern: http://my.log-browsing.url/<jobid>
# HistoryServer will replace <jobid> and <tmid>
historyserver.log.taskmanager.url-pattern: http://my.log-browsing.url/<jobid>/<tmid>
建议把这里对接到日志检索入口,形成'指标页 → 日志页'的闭环体验。
6. REST API:用 JSON 接入平台
所有请求形如 http://hostname:8082/。常用接口包括 /config、/jobs/overview、/jobs/ 及其下的异常、配置、顶点信息等。
几个常用的 curl 示例:
# 查看历史作业总览
curl http://historyserver:8082/jobs/overview
# 查看某个作业异常
curl http://historyserver:8082/jobs/<jobid>/exceptions
# 查看执行计划(DAG)
curl http://historyserver:8082/jobs/<jobid>/plan
# 查看算子的 subtask 执行耗时
curl http://historyserver:8082/jobs/<jobid>/vertices/<vertexid>/subtasktimes
7. 生产最佳实践与常见坑
-
归档目录要稳定且权限正确 多 JM/TM 节点都要能访问,尤其是 HDFS 或对象存储。权限问题是导致'归档写不进去/HistoryServer 读不到'的最常见原因。
-
对象存储插件不能少 如果路径是 s3://、oss:// 等,必须确保对应插件 jar 在 plugins 中并正确配置凭证。
-
规划本地缓存容量 History Server 会把归档下载到本地缓存,长期运行且归档多时,需要磁盘容量与清理策略。如果归档目录按天分区,也可以通过目录规划降低单目录压力。
-
轮询间隔按需调整 作业量大时过于频繁会对存储造成额外压力;作业量小但需要快速可见性(如发布验证),可以缩短 interval。
-
日志跳转模板要真实可用 最好在日志平台侧做 jobId/tmId 维度的索引或查询预置,否则跳过去仍然找不到日志。
