Spark history server 部署
一. history server 的作用
我们知道,在提交 spark 任务后,可以通过 SparkUI 的地址 http://<driver-node>:4040 查看应用的状态、实时日志等信息,但是一旦应用运行完成或者停止,我们就查看不了这些信息了,这时我们可以配置 Spark history server,它可以将历史 app 的日志放到指定hdfs 目录,然后通过 http 接口开放出来。
二. 配置 history server
以原生 Spark 配置为例,我的 SPARK_HOME
目录为 /data/spark-3.3.2-bin-hadoop3
,首先确保现有的spark配置是正确,然后才开始配置history server,主要配置两个文件 conf/spark-defaults.conf
和 conf/spark-env.sh
conf/spark-defaults.conf
,开启eventLog,同时配置清理策略。
spark.eventLog.enabled true
spark.eventLog.dir hdfs://test-comp-node03:8020/spark/event_log
spark.history.fs.cleaner.enabled true
spark.history.fs.cleaner.interval 1d
spark.history.fs.cleaner.maxAge 7d
conf/spark-env.sh
,retainedApplications 表示在缓存中保存了历史应用个数。
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=50 -Dspark.history.fs.logDirectory=hdfs://test-comp-node03:8020/spark/event_log"
2.1 同步配置及创建目录
- 将两个文件
conf/spark-defaults.conf
和conf/spark-env.sh
同步集群的其他机器,确保在启动任何的时候也能读取到 env 配置。 - 创建存放日志的目录
hadoop fs -mkdir -p /spark/event_log
2.2 启动 history server
找一个节点用于启动 history server,只需要在一个节点启动即可,我的环境是计划在 test-comp-node03 启动。
$ pwd
/data/spark-3.3.2-bin-hadoop3
$ ./sbin/start-history-server.sh
starting org.apache.spark.deploy.history.HistoryServer, logging to /data/spark-3.3.2-bin-hadoop3/logs/spark-hdfs-org.apache.spark.deploy.history.HistoryServer-1-test-comp-node03.out
$ tail -f /data/spark-3.3.2-bin-hadoop3/logs/spark-hdfs-org.apache.spark.deploy.history.HistoryServer-1-test-comp-node03.out
23/06/26 16:58:00 INFO SignalUtils: Registering signal handler for INT
23/06/26 16:58:01 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
23/06/26 16:58:01 INFO SecurityManager: Changing view acls to: hdfs
23/06/26 16:58:01 INFO SecurityManager: Changing modify acls to: hdfs
23/06/26 16:58:01 INFO SecurityManager: Changing view acls groups to:
23/06/26 16:58:01 INFO SecurityManager: Changing modify acls groups to:
23/06/26 16:58:01 INFO SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(hdfs); groups with view permissions: Set(); users with modify permissions: Set(hdfs); groups with modify permissions: Set()
23/06/26 16:58:01 INFO FsHistoryProvider: History server ui acls disabled; users with admin permissions: ; groups with admin permissions:
23/06/26 16:58:02 INFO Utils: Successfully started service 'HistoryServerUI' on port 18080.
23/06/26 16:58:02 INFO HistoryServer: Bound HistoryServer to 0.0.0.0, and started at http://test-comp-node03:18080
三. 使用 history server
启动 history server 后,新提交的 application 都会在 hdfs 上的 /spark/event_log 目录下创建日志文件,application 没有完成的日志 以 .inprogress
结尾,应用结束后会去掉.inprogress
标识。
如果是 spark streaming 程序,这个日志一直会是 .inprogress
,所以spark.history.fs.cleaner
在清理的时候会直接删除,应用程序找不到这个文件就会报错了。解决办法 spark2.0 和 spark3.0 方法不同。
spark3.0
spark3.0 直接提供了 eventLog 的 Rolling 功能。
- maxFileSize 最小值为10M
spark-submit \
--conf spark.eventLog.rolling.enabled=true \
--conf spark.eventLog.rolling.maxFileSize=128m \
--conf spark.history.fs.eventLog.rolling.maxFilesToRetain=3 \
....
spark2.0
方法1:直接禁用掉eventLog
spark-submit --conf spark.eventLog.enabled=false ....
方法2:可以使用自动文件切换
log4j-spark.properties
,准备 log4j 配置文件
log4j.rootLogger=INFO,rolling
log4j.appender.rolling=org.apache.log4j.RollingFileAppender
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.conversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %5p %t %c{2}:%L - %m%n
log4j.appender.rolling.maxFileSize=10MB
log4j.appender.rolling.maxBackupIndex=5
log4j.appender.rolling.encoding=UTF-8
log4j.appender.rolling.file=/absolute/path/filename.log
log4j.logger.org.apache.spark=WARN
log4j.logger.org.eclipse.jetty=WARN
- 提交程序运行
spark-submit \
--master yarn \
--driver-memory 2g \
--num-executors 2 \
--executor-cores 2 \
--executor-memory 1g \
--files ./log4j-spark.properties \
--conf spark.eventLog.enabled=false \
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j-spark.properties" \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j-spark.properties" \
--class com.example.MainExample target/example_scala-1.0-SNAPSHOT-jar-with-dependencies.jar