spark - History Server配置

1.spark web ui

web ui(4040端口)也看的stages tab页面,展示job的运行情况,调优的时候需要跟进这个页面的去分析

但是 web ui 在job跑完或者sc.stop 之后,4040页面会关闭,无法访问

在spark的官网More ->  Moniting页面(http://spark.apache.org/docs/latest/monitoring.html)有介绍History Server可以解决上面的问题

 

 

2.History Server参数配置

(1)spark-default.conf文件配置:

spark.eventlog.enabled=true (开启关联)

spark.histpry.fs.logDirectory (记录日志的目录)

spark.eventlog.dir  hdfs://hd1:9000/spark-event-log (目录必须事先创建好)

spark.history.fs.update.interval (默认10s更新检测/spark-log目录下的文件内容变更)

spark.history.retainedApplicaions   50 ( 这个参数什么意思?自己查)

 

spark.evetlog.compress (默认不开启压缩,建议开启)

spark.io.compression.codec (默认是lz4压缩,不用改,直接用推荐的即可)

spark.io.compression.lz4.blocksize (默认是32k,太小,需要调大)

 

spark.history.ui.port  (默认是18080)

spark.history.fs.cleaner.enable (开启日清理,默认是false)

spark.history.fs.cleaner.interval (默认1d检测一次)

spark.history.fs.cleaner.maxAge (清理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对象,如下图所示:


 

猜你喜欢

转载自coderlxl201209164551.iteye.com/blog/2414512