在跑Spark作业的时候,或者从半夜跑到第二天,你常常需要看下运行信息以及运行情况;这样就可以根据这些运行情况进行调优,由此可见,Spark作业在运行时的监控就显得尤为重要了。
常用的Spark应用程序监控方法有Spark Web UI、Spark HistoryServer UI、REST API等,详情可参考上一篇转载的博客。
通过Spark Web UI进行监控
在每一个SparkContext都会启动一个Web UI用来展示一些有关应用程序的非常有用的信息,默认在4040端口;
在Web UI上可以看到很多有用的信息,比如:Status、Host、Duration、gc、launch的时间,这些在生产过程中经常需要去观察;但是当任务跑完或者挂了的话,就没有Web UI了,上面也不能看到任何信息;不论local模式还是Cluster模式,都是一样的;
比如访问http://hadoop-01:4040,看到以下信息:
当然,如果你想在sc.stop()后,即Spark应用程序停掉后,仍能去访问Web UI,那么你就需要在启动应用程序前,把spark.eventLog.enabled 这个参数设置成true。
通过Spark HistoryServer UI进行监控
在Spark应用程序结束后,通过Spark HistoryServer把已经记录记录或者保存下来的event事件的信息,重新在UI界面上把这些信息给渲染出来,渲染出来的UI界面同Web UI展示的是一模一样的;
如何通过Spark HistoryServer 就行监控?
1.修改spark-defaults.conf配置文件:
spark.eventLog.enabled true //把记录日志事件开启
spark.eventLog.dir hdfs://namenode/shared/spark-logs 把记录的日志放在这个目录
[hadoop@hadoop-01 ~]$ cd $SPARK_HOME
[hadoop@hadoop-01 spark-2.4.2-bin-2.6.0-cdh5.7.0]$ cd conf/
//编辑这个配置文件,修改s上述两个参数(其它参数不动)
//9000这个端口号要注意一下,有的可能是8020
[hadoop@hadoop001 conf]$ vi spark-defaults.conf
spark.eventLog.enabled true
spark.eventLog.dir hdfs://hadoop-01:9000/g6_directory
[hadoop@hadoop001 conf]$ hdfs dfs -mkdir /g6_directory //这个目录需要手动创建
2.修改spark-env.sh配置文件
有些环境变量需要配置,比如SPARK_HISTORY_OPTS (当然还有其它参数,请参考上一篇转载的博客):
SPARK_HISTORY_OPTS //以spark.history.*这个开头的都配置在这个地方配置
那么以spark.history.*这个开头的配置有哪些呢?比如说:
//这些参数都有默认值的
spark.history.fs.logDirectory //从哪里读取日志,上面的spark.eventLog.dir 表示记到哪里去,记在哪里就要从哪里去读取这个日志
spark.history.fs.update.interval
spark.history.fs.cleaner.enabled
spark.history.fs.cleaner.interval
如何配置呢?在spark-env.sh这个配置文件里配置,例如:
[hadoop@hadoop001 conf]$ vi spark-env.sh
# - SPARK_HISTORY_OPTS, to set config properties only for the history server (e.g. "-Dx=y")
SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://hadoop001:9000/g6_directory"
//其余参数类似
3.启动
//启动
[hadoop@hadoop-01 sbin]$ ./start-history-server.sh
starting org.apache.spark.deploy.history.HistoryServer, logging to /home/hadoop/app/spark-2.4.2-bin-2.6.0-cdh5.7.0/logs/spark-hadoop-org.apache.spark.deploy.history.HistoryServer-1-hadoop-01.out
//jps看下进程,出现了HistoryServer进程
[hadoop@hadoop-01 sbin]$ jps
32258 SparkSubmit
15511 SecondaryNameNode
11241 ResourceManager
32715 HistoryServer
32764 Jps
11373 NodeManager
15278 DataNode
15151 NameNode
//HistoryServer
[hadoop@hadoop-01 sbin]$ more /home/hadoop/app/spark-2.4.2-bin-2.6.0-cdh5.7.0/logs/spark-hadoop-org.apache.spark.deploy.history.HistoryServer-1-hadoop-01.out
Spark Command: /usr/java/jdk1.8.0_45/bin/java -cp /home/hadoop/app/spark-2.4.2-bin-2.6.0-cd
h5.7.0/conf/:/home/hadoop/app/spark-2.4.2-bin-2.6.0-cdh5.7.0/jars/* -Dspark.history.fs.logD
irectory=hdfs://hadoop-01:9000/g6_directory -Xmx1g org.apache.spark.deploy.history.HistoryS
erver
========================================
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
19/07/26 10:41:35 INFO HistoryServer: Started daemon with process name: 32715@hadoop-01
19/07/26 10:41:35 INFO SignalUtils: Registered signal handler for TERM
19/07/26 10:41:35 INFO SignalUtils: Registered signal handler for HUP
19/07/26 10:41:35 INFO SignalUtils: Registered signal handler for INT
19/07/26 10:41:35 WARN NativeCodeLoader: Unable to load native-hadoop library for your plat
form... using builtin-java classes where applicable
19/07/26 10:41:35 INFO SecurityManager: Changing view acls to: hadoop
19/07/26 10:41:35 INFO SecurityManager: Changing modify acls to: hadoop
19/07/26 10:41:35 INFO SecurityManager: Changing view acls groups to:
19/07/26 10:41:35 INFO SecurityManager: Changing modify acls groups to:
19/07/26 10:41:35 INFO SecurityManager: SecurityManager: authentication disabled; ui acls d
isabled; users with view permissions: Set(hadoop); groups with view permissions: Set(); us
ers with modify permissions: Set(hadoop); groups with modify permissions: Set()
19/07/26 10:41:35 INFO FsHistoryProvider: History server ui acls disabled; users with admin
permissions: ; groups with admin permissions
19/07/26 10:41:36 INFO FsHistoryProvider: Parsing hdfs://hadoop-01:9000/g6_directory/local-
1564107825549.inprogress for listing data...
19/07/26 10:41:37 INFO Utils: Successfully started service on port 18080.
19/07/26 10:41:37 INFO HistoryServer: Bound HistoryServer to 0.0.0.0, and started at http:/
/hadoop-01:18080
19/07/26 10:41:37 INFO FsHistoryProvider: Finished parsing hdfs://hadoop-01:9000/g6_directo
ry/local-1564107825549.inprogress
//ps -ef看一下,可以看到它是一个java进程 还有其它参数 包括我们自己设置的
[hadoop@hadoop-01 sbin]$ ps -ef |grep HistoryServer
hadoop 361 31384 0 10:43 pts/1 00:00:00 grep HistoryServer
hadoop 32715 1 5 10:41 pts/1 00:00:06 /usr/java/jdk1.8.0_45/bin/java -cp /home/hadoop/app/spark-2.4.2-bin-2.6.0-cdh5.7.0/conf/:/home/hadoop/app/spark-2.4.2-bin-2.6.0-cdh5.7.0/jars/* -Dspark.history.fs.logDirectory=hdfs://hadoop-01:9000/g6_directory -Xmx1g org.apache.spark.deploy.history.HistoryServer
4.访问
通过以上日志可以看出访问地址:http://hadoop-01:18080
5.停止HistoryServer
//不需要的话可以这样停掉
[hadoop@hadoop-01 sbin]$ ./stop-history-server.sh
stopping org.apache.spark.deploy.history.HistoryServer
可以去这个目录看一下它的日志;
[hadoop@hadoop-01 sbin]$ hdfs dfs -ls /g6_directory
Found 1 items
-rwxrwx--- 3 hadoop supergroup 213 2019-07-26 10:23 /g6_directory/local-1564107825549.inprogress
可以看到它后缀是一个application id,如果有多个应用程序的话,就会有多个类似的文件,而且如果查看的话,会发现它是一个json格式的。下面访问的json格式的信息就是从这里来的,把这些信息放到页面上而已。
通过REST API进行监控
这种方式通过向REST发送一个请求,返回的是JSON格式的信息,这是以JSON来进行交互的。而上面的Web UI的监控方式都是页面定义好的。而通过这种REST API的监控,对于开发人员来说,可以自己去创建新的可视化和监视工具,定义自己想要的监控程序。
正在运行的程序,以前运行的程序,都可以使用REST API来监控。对于历史服务器,它们通常可以在http://hadoop-01:18080/api/v1访问,对于正在运行的应用程序,可以在http://hadoop-01:18080/api/v1访问。