spark历史服务器
spark历史服务器:追踪任务全生命周期
Spark 跑任务的时候,4040 端口能看到执行详情——DAG、Stage、Task、Shuffle 数据量。
但任务一结束,4040 就关了。你还没来得及看,窗口没了。
历史服务器解决的就是这个问题:把任务日志持久化存下来,跑完也能看。
- 应用跑的时候 → 把事件日志写到指定目录(HDFS 或本地)
- 应用跑完之后 → 历史服务器从那个目录读日志,生成 Web UI
- 你在 18080 端口能看到所有历史任务
配置分两步:应用写日志 + 服务读日志
这两步必须配同一个目录——应用往那里写,历史服务器从那里读。
Spark 应用 → 写日志到 /spark-history → 历史服务器 → 从 /spark-history 读 → 展示在 18080
第一步:让 Spark 应用写日志(spark-defaults.conf)
cd $SPARK_HOME/conf
cp spark-defaults.conf.template spark-defaults.conf
在文件里加两行:
spark.eventLog.enabled true
spark.eventLog.dir hdfs://localhost:9000/spark-history
| 参数 | 说明 |
|---|---|
spark.eventLog.enabled |
开日志收集,默认是关的 |
spark.eventLog.dir |
日志写到哪(HDFS 或本地路径) |
路径支持两种:
# HDFS 路径(生产推荐,分布式存储)
spark.eventLog.dir hdfs://localhost:9000/spark-history
# 本地路径(单机测试用)
spark.eventLog.dir file:///usr/local/spark/logs/history
提前创建目录并给权限:
HDFS
hadoop fs -mkdir -p /spark-history
hadoop fs -chmod 777 /spark-history
本地
mkdir -p /usr/local/spark/logs/history
chmod 777 /usr/local/spark/logs/history
第二步:启动历史服务器读日志(spark-env.sh)
cd $SPARK_HOME/conf
cp spark-env.sh.template spark-env.sh
在文件里加:
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://localhost:9000/spark-history
-Dspark.history.retainedApplications=50
-Dspark.history.fs.cleaner.enabled=true
-Dspark.history.fs.cleaner.maxAge=7d
"
| 参数 | 说明 | 推荐值 |
|---|---|---|
spark.history.ui.port |
历史服务器 Web 端口 | 18080 |
spark.history.fs.logDirectory |
读日志的目录(必须跟应用写日志的目录一致) | 跟 spark.eventLog.dir 相同 |
spark.history.retainedApplications |
保留多少个历史任务 | 50-100 |
spark.history.fs.cleaner.enabled |
自动清理过期日志 | true |
spark.history.fs.cleaner.maxAge |
日志保留多久 | 7d(7 天) |
启动历史服务器
SPARK_HOME/sbin/start-history-server.sh
验证进程:
jps
应该看到 HistoryServer
验证 Web UI:
浏览器打开 http://localhost:18080,能看到已完成应用的列表。
验证日志生成
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[*] \
SPARK_HOME/examples/jars/spark-examples_2.12-3.1.1.jar \
10
跑完后检查日志目录:
HDFS
hadoop fs -ls /spark-history
本地
ls /usr/local/spark/logs/history
应该能看到类似 application_xxx_xxx.inprogress(运行中)或 application_xxx_xxx(已完成)的日志文件。
再去 18080 页面刷新,应该能看到这个任务。
常见问题
1. 历史服务器看不到任何应用
检查顺序:
① spark.eventLog.enabled 是不是 true
② spark.eventLog.dir 和 spark.history.fs.logDirectory 是不是指向同一个目录
③ 目录有没有写权限(hadoop fs -chmod)
2. 能看到应用列表,但点进去报错
通常是日志文件损坏或日志格式不兼容。检查 Spark 版本是否一致(历史服务器的版本跟提交任务的版本要匹配)。
3. 日志文件越来越多,磁盘快满了
开自动清理:
-Dspark.history.fs.cleaner.enabled=true
-Dspark.history.fs.cleaner.maxAge=7d
或者手动删:
hadoop fs -rm -r /spark-history/application_xxx_xxx
4. 18080 端口被占用
改 spark.history.ui.port 换成其他端口,比如 18081