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.dirspark.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