Spark集群重启后Worker/Master节点历史丢失,如何配置保留?
解决Spark集群重启后丢失已完成应用/驱动历史记录的问题
你已经开启了事件日志但还是丢记录?问题大概率出在Master节点元数据没持久化和事件日志存储路径不合理这两个点上,咱们一步步捋清楚:
1. 先搞定Master的元数据持久化(核心!)
Spark默认把Master的集群状态(包括已完成的应用、驱动记录)存在内存里,一旦Master重启,这些数据直接清空——这和事件日志开没开没关系,事件日志是给History Server用的,Master自身的历史记录得单独配置持久化。
打开spark-env.sh,添加以下配置:
# 用文件系统持久化的写法,换成你的持久化存储路径(比如HDFS或共享目录) export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=FILESYSTEM -Dspark.deploy.recoveryDirectory=/path/to/persistent/storage"
如果你的集群用ZooKeeper做HA,也可以用ZK来存元数据:
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=zk-node1:2181,zk-node2:2181 -Dspark.deploy.zookeeper.dir=/spark/recovery"
⚠️ 注意:路径必须是所有节点都能访问的持久化存储,不能用本地临时目录,否则重启还是丢。
2. 修正事件日志的存储配置
你现在用的file:////app/spark/logs/data/event_log_dir是本地路径,会有两个坑:
- 每个Worker的日志存在本地,Master/History Server读不全所有节点的日志;
- Worker节点重启或故障,本地日志直接没了。
改成分布式存储路径(比如HDFS、NFS),在spark-defaults.conf里修改:
spark.eventLog.enabled true # 示例:HDFS路径,换成你的集群地址 spark.eventLog.dir hdfs://your-hdfs-cluster/path/spark-event-logs # 如果用NFS共享目录:file:///mnt/nfs/spark-event-logs
记得提前给路径开权限,比如HDFS:
hdfs dfs -mkdir -p /path/spark-event-logs hdfs dfs -chmod 777 /path/spark-event-logs
3. 启动Spark History Server
光有日志还不够,得启动History Server来加载这些日志,这样即使Master重启,也能通过它查看所有历史记录:
$SPARK_HOME/sbin/start-history-server.sh
启动后访问http://<history-server-node>:18080,就能看到所有已完成应用的详细运行记录了。
4. 验证配置是否生效
- 重启Master,去你配置的
recoveryDirectory目录下看看,有没有生成app-*.json、driver-*.json这类元数据文件; - 跑个测试应用,完成后检查事件日志目录有没有对应的日志文件;
- 重启整个集群,再登Master UI和History Server UI,确认已完成的应用/驱动记录还在。
要是你用的是YARN集群,还得开YARN的日志聚合功能,但Standalone集群按上面的步骤来就够了。
内容的提问来源于stack exchange,提问作者Gokulraj
相关产品推荐
相关产品推荐

