已复制
全屏展示
复制代码

Spark history server 部署


· 4 min read

一. 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.confconf/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.confconf/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

文章推荐