0%

spark历史服务器

spark历史服务器配置指南:追踪任务全生命周期

Spark 应用运行时,可通过 4040 端口的 Web UI 实时监控任务状态,但应用停止后该界面会关闭。为了追溯已完成任务的执行详情(如 DAG、Stage、Task 指标),需配置 Spark 历史服务器(History Server),持久化存储任务日志并提供历史查询能力。本文详细讲解历史服务器的配置步骤、启动方法及日志管理,帮助开发者完整追踪任务生命周期。

历史服务器核心作用与原理

解决的核心问题

  • 实时 UI 局限性:Spark 应用运行时的 4040 端口 UI 仅在应用存活时可用,应用停止后无法查看历史数据;
  • 日志持久化需求:生产环境需留存任务日志用于问题排查、性能优化和审计;
  • 集群监控补充:历史服务器可整合所有应用的历史数据,形成全局任务执行报表。

工作原理

  1. 日志收集:Spark 应用运行时,将事件日志(如任务启动、Stage 完成、数据 Shuffle 等)写入指定存储(HDFS 或本地文件系统);
  2. 历史服务器读取:History Server 启动后,从指定存储目录加载历史日志,解析并生成可视化 UI;
  3. Web 访问:用户通过 History Server 的 Web 界面(默认 18080 端口)查询历史任务详情。

历史服务器配置步骤

环境前置条件

  • 已安装并配置 Spark 集群(本地模式、Standalone 或 YARN 模式均可);
  • 若使用 HDFS 存储日志,需确保 HDFS 集群正常运行,且 Spark 有权限读写 HDFS 目录。

配置事件日志存储(spark-defaults.conf)

Spark 事件日志的存储路径和开关通过 spark-defaults.conf 配置,步骤如下:

复制模板文件
1
2
cd $SPARK_HOME/conf  
cp spark-defaults.conf.template spark-defaults.conf
编辑配置文件

添加以下内容,指定日志存储路径和启用日志收集:

1
2
3
4
5
6
7
8
9
# 启用事件日志收集(默认 false,需设为 true)  
spark.eventLog.enabled true

# 事件日志存储路径(支持 HDFS 或本地路径)
# HDFS 路径示例(推荐生产环境,支持分布式存储):
spark.eventLog.dir hdfs://localhost:9000/spark-history

# 本地路径示例(仅单机测试用):
# spark.eventLog.dir file:///usr/local/spark-3.1.1/logs/history

注意:

  • 路径需提前创建,否则应用运行时会报错;
  • HDFS 路径需确保 Spark 进程有读写权限(可通过 hadoop fs -chmod 777 /spark-history 临时授权)。

配置历史服务器参数(spark-env.sh)

History Server 的运行参数(如 Web 端口、日志目录、保留历史记录数)通过 spark-env.sh 配置:

编辑配置文件
1
vi $SPARK_HOME/conf/spark-env.sh  
添加历史服务器参数
1
2
3
4
5
6
7
8
# Spark History Server 配置  
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080 # Web UI 端口(默认 18080)
-Dspark.history.fs.logDirectory=hdfs://localhost:9000/spark-history # 日志存储目录(需与 spark.eventLog.dir 一致)
-Dspark.history.retainedApplications=30 # 保留的历史应用最大数量(超出自动删除)
-Dspark.history.fs.cleaner.enabled=true # 启用日志自动清理
-Dspark.history.fs.cleaner.maxAge=7d # 日志保留最大天数(7 天)
"

创建日志存储目录(关键步骤)

若使用 HDFS 存储日志,需提前创建目录:

1
2
3
4
# 在 HDFS 上创建目录  
hadoop fs -mkdir -p /spark-history
# 赋予读写权限(测试环境宽松授权,生产环境需严格控制)
hadoop fs -chmod 777 /spark-history

若使用本地存储,在本地文件系统创建目录:

1
2
mkdir -p /usr/local/spark-3.1.1/logs/history  
chmod 777 /usr/local/spark-3.1.1/logs/history

启动历史服务器与验证

启动历史服务器

执行 Spark 自带的启动脚本:

1
$SPARK_HOME/sbin/start-history-server.sh  

验证进程是否启动:

1
2
3
jps  # 应显示 HistoryServer 进程  
# 输出示例:
# 12345 HistoryServer

提交应用生成历史日志

提交一个 Spark 应用(如 SparkPi 示例),触发事件日志写入:

1
2
3
4
5
$SPARK_HOME/bin/spark-submit \  
--class org.apache.spark.examples.SparkPi \
--master local[*] \
$SPARK_HOME/examples/jars/spark-examples_2.12-3.1.1.jar \
10

应用执行完成后,检查日志目录是否生成日志文件:

1
2
3
4
5
# HDFS 目录检查  
hadoop fs -ls /spark-history

# 本地目录检查
ls /usr/local/spark-3.1.1/logs/history

访问历史服务器 Web UI

打开浏览器,访问 History Server 地址:

1
http://localhost:18080  # 本地模式,若为集群则替换为 Master 节点 IP  

界面显示已完成的 Spark 应用列表,点击应用名称可查看详情:

  • 应用概览:执行时间、持续时长、Executor 数量、总任务数;
  • DAG 可视化:应用的 DAG 图,展示 RDD 依赖关系;
  • Stage 详情:每个 Stage 的任务数、Shuffle 数据量、执行时间;
  • Task 指标:每个 Task 的运行时间、GC 时间、输入输出数据量。

关键参数详解与优化

核心配置参数

参数 作用 推荐值
spark.eventLog.enabled 启用事件日志收集 true(生产环境必须开启)
spark.eventLog.dir 事件日志存储路径 HDFS 路径(如 /spark-history),支持分布式存储
spark.history.ui.port 历史服务器 Web 端口 18080(避免与其他服务冲突)
spark.history.fs.logDirectory 历史服务器读取日志的目录 spark.eventLog.dir 一致
spark.history.retainedApplications 保留的历史应用最大数量 50(根据磁盘空间调整)
spark.history.fs.cleaner.enabled 启用日志自动清理 true(避免磁盘占满)
spark.history.fs.cleaner.maxAge 日志保留最大天数 7d(生产环境可设为 30d)

性能优化建议

  • 日志压缩:启用事件日志压缩,减少存储占用:

    1
    spark.eventLog.compress  true  # 在 spark-defaults.conf 中添加  
  • 日志分区:HDFS 目录设置合理的块大小(如 128MB),避免单个日志文件过大;

  • 定期归档:超过保留期的日志可归档到低成本存储(如 S3 归档层),而非直接删除;

  • 集群模式适配

    • YARN 模式:可将日志存储在 YARN 日志目录(yarn.nodemanager.log-dirs),通过 YARN 日志聚合功能整合;
    • Standalone 模式:建议使用 HDFS 存储日志,避免单点故障。

常见问题与解决方案

1. 历史服务器看不到应用日志

  • 原因 1spark.eventLog.enabled 未设为 true,应用未生成日志;
    解决:在 spark-defaults.conf 中开启日志收集,重启应用。
  • 原因 2:日志目录路径不一致(spark.eventLog.dirspark.history.fs.logDirectory 不匹配);
    解决:确保两个参数指向同一目录。
  • 原因 3:Spark 应用无权限写入日志目录;
    解决:通过 hadoop fs -chmod 777 /spark-history 授予权限(生产环境需配置更严格的 ACL)。

2. 历史服务器加载日志缓慢

  • 原因:日志文件过大或数量过多,解析耗时;
  • 解决:启用日志压缩(spark.eventLog.compress=true),配置日志自动清理参数减少日志总量。

3. 历史服务器启动失败,提示 “端口被占用”

  • 原因spark.history.ui.port 被其他服务占用(如 18080 被占用);
  • 解决:修改 spark.history.ui.port 为其他端口(如 18081),重启历史服务器。

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10