spark - History Server configuration

1.spark web ui

The web ui (port 4040) also sees the stages tab page to show the running status of the job. When tuning, you need to follow up on this page to analyze

But after the web ui runs the job or sc.stop, the 4040 page will be closed and cannot be accessed

In spark's official website More -> Monitoring page (http://spark.apache.org/docs/latest/monitoring.html), it is introduced that History Server can solve the above problems

 

 

2.History Server parameter configuration

(1) spark-default.conf file configuration:

spark.eventlog.enabled=true (enable association)

spark.histpry.fs.logDirectory (log directory)

spark.eventlog.dir hdfs://hd1:9000/spark-event-log (the directory must be created in advance)

spark.history.fs.update.interval (default 10s update to detect file content changes in the /spark-log directory)

spark.history.retainedApplicaions 50 (What does this parameter mean? Check it yourself)

 

spark.evetlog.compress (compression is not enabled by default, it is recommended to enable)

spark.io.compression.codec (The default is lz4 compression, no need to change it, just use the recommended one)

spark.io.compression.lz4.blocksize (default is 32k, too small, need to be increased)

 

spark.history.ui.port (default is 18080)

spark.history.fs.cleaner.enable (enable daily cleaning, default is false)

spark.history.fs.cleaner.interval (default 1d detection once)

spark.history.fs.cleaner.maxAge (clean up logs before 7d)

 

    本地测试的配置:

    spark-defaults.conf文件

## 配置history server ##
spark.eventLog.enabled true

#是否压缩记录Spark事件,前提spark.eventLog.enabled为true,默认使用的是snappy
spark.eventLog.compress	true

#Application在运行过程中所有的信息均记录在该属性指定的路径下
spark.eventLog.dir hdfs://hd1:9000/spark-event-log

#Spark History Server页面只展示该指定路径下的信息
#spark.history.fs.logDirectory hdfs://hd1:9000/spark-event-log

#该参数并不是也页面中显示的application的记录数,而是存放在内存中的个数,内存中的信息在访问页面时直接读取渲染既可;
#比如说该参数配置了10个,那么内存中就最多只能存放10个applicaiton的日志信息,当第11个加入时,第一个就会被踢除,
#当再次访问第1个application的页面信息时就需要重新读取指定路径上的日志信息来渲染展示页面。 
#spark.history.retainedApplications 3 

#以秒为单位,更新日志相关信息的时间间隔,默认是10s
#spark.history.fs.update.interval 10

#history server的端口18080
#spark.history.ui.port 18081

#日志清理
#spark.history.fs.cleaner.enabled true
#spark.history.fs.cleaner.interval 1d (默认是1天检测一次)
#spark.history.fs.cleaner.maxAge   7d (默认清理超过7天的日志)

#默认值:false,是否使用kerberos方式登录访问HistoryServer,对于持久层位于安全集群的HDFS上是有用的,如果设置为true,就要配置下面的两个属性
#spark.history.kerberos.enabled

#默认值:用于HistoryServer的kerberos主体名称
#spark.history.kerberos.principal

#用于HistoryServer的kerberos keytab文件位置
#spark.history.kerberos.keytab

#默认值:false,授权用户查看应用程序信息的时候是否检查acl。如果启用,只有应用程序所有者和spark.ui.view.acls指定的用户可以查看应用程序信息;否则,不做任何检查
#spark.history.ui.acls.enable

 

 

(2)spark-env.sh文件配置

spark_history_opts ="-Dspark.history.fs.logDirectory=hdfs:///spark-event-log/" (展示和查看日志的地方) (注意:opts参数都是 java的参数,用-D指定,这里也可以支持多个目录,待测试)

 

    本地测试:

    spark-env.sh

SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs:///spark-event-log/ -Dspark.history.fs.cleaner.enabled=true"

  

(3)开启服务

sbin/start-history-server.sh (开启history服务)

 

(4)hadoop dfs -ls  /spark-log/  查看这个目录下,有incomplete何complete两种文件夹,分别对应 18080端口对应的web ui上的incomplete和complete两个展示项

  •     hdfs目录:


 

  •      historyServer的web 18080页面

    *下面是complete的页面



 

     *下面是incomplete的job


 

(5)spark-shell如果不调用sc.stop方法,直接ctrl+c推出,在History server上一直处于incomplete状态

本地的spark2.2版本 spark-shell --master yarn 命令直接ctrl+c退出,未复现这个问题(是否是低版本存在,待确认)

 

 

3.jps查看History的进程,然后ps -ef  | grep 进程ID   查看进程

查看star-history-server.sh内容,查看HistoryServer源码(注:jps能看到的进程,都有源码里的main方法与之对应)


 

HistoryServer源码入口:


 

 

 

4.源码(spark2.2.0)里的ui包和web 8080页面下的Tab页对应

源码查找SparkUI类

 

 

5.spark也提供了rest api自定义监控

官网http://spark.apache.org/docs/latest/monitoring.html REST API部分 ,注意:18080端口是historyserver的(对应多个application),4040端口仅对应一个活着的application,

    本地测试:


 

 

总结:

在测试时候发现个现象,测试流程:  使用spark-shell --master yarn 启动一个application

(1)如果spark.eventLog.compress 设为 false

        此时在HistoryServer的180080页面incomplete下有这个application

        而且hdfs目录/spark-event-log目录下的文本文件有内容,大小不是0



 



 

(2)如果spark.eventLog.compress 设为 true

        此时在HistoryServer的180080页面incomplete下没有这个application

        而且hdfs目录/spark-event-log目录下的lz4压缩文件没有内容,大小是0

 

 

 (3)在(2)的集成上继续测试, 在启动的spark-shell中执行下面语句:

val rdd=sc.textFile("file:///root/1.txt")   //执行完,文件大小还是0

rdd.count  //执行完,文件才有内容,大小变为7.87kB


 

 

查看 .inprogress文件,头部几条数据和 不压缩时候的一样


 

 

 

翻阅源码:

HistoryServer相关的几个类文件

 

大体流程:

  • HistoryServer 内部有一个cache, 缓存application信息,这个cache的大小是spark.history.retainedApplications参数的值,cache有淘汰机制
  • HistoryServer.scala中有个provider.getAppUI 方法获取显示在18080页面上的ui信息,application的信息保存在内存或者磁盘上(由spark.history.store.path控制,默认内存),对应着KVStore.scala接口,元数据信息分别存在内存或LevelDB里
  • 当文件变更后,getAppUI方法会根据存储的位置,重建ui对象信息,然后返回一个新的SparkUI对象,如下图所示:


 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326115013&siteId=291194637