Spark之Monitor


在跑Spark作业的时候,或者半夜跑完之后第二天,你常常需要看它运行时的信息,看一下运行情况,以及根据这些信息进行调优等,那么对于Spark作业的运行时监控就显得很重要了。
有几种方法可以监控Spark应用程序,常用的有Web UI,history server、REST API等,当然还有其它的不常用的,可以参考上一篇博客。

通过Spark Web UI进行监控

每一个SparkContext都会启动一个web UI用来展示应用相关的一些非常有用的信息,默认在4040端口。
在Web UI界面可以看很多信息,比如说Status、Host、Duration、gc,launch的时间,这在生产上经常要去观察 。但是当任务成功跑完或者失败挂了,就没有WebUI了,是无法看到任何信息的,不管是跑在本地,还是在YARN上面都是一样的。
比如访问:http://hadoop001:4040,看到以下信息:
在这里插入图片描述
在这里插入图片描述
如果你想在sc.stop()后,就是你的Spark应用程序停掉后,还去访问 web UI ,那么就要在启动应用程序之前,把 spark.eventLog.enabled 这个参数设置成true。

通过Spark HistoryServer UI进行监控

在Spark应用程序结束后,通过Spark HistoryServer 还能通过已经记录或者保存下来的event事件信息,重新在UI界面上把这些信息给渲染出来,渲染出来的UI和上面默认展示的Web UI展示的是一模一样的。
那么如何使用HistoryServer ?看下面步骤

①第一步 配置spark-defaults.conf
spark.eventLog.enabled true    //把记录日志事件开启
spark.eventLog.dir hdfs://namenode/shared/spark-logs  把记录的日志放在这个目录
[hadoop@hadoop001 conf]$ pwd   //进入conf目录
/home/hadoop/app/spark-2.4.2-bin-2.6.0-cdh5.7.0/conf

//编辑这个配置文件,修改下面两个参数如下(其它参数不动)
 //9000这个端口号要注意一下,有的可能是8020
[hadoop@hadoop001 conf]$ vi spark-defaults.conf 
spark.eventLog.enabled           true
spark.eventLog.dir               hdfs://hadoop001:9000/g6_directory

[hadoop@hadoop001 conf]$ hdfs dfs -mkdir /g6_directory   //还要创建这个目录
②第二步 配置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这个配置文件里配置,举个例子:

 //编辑这个文件,配置如下,其它参数类似:
 //9000这个端口号要注意一下,有的可能是8020
[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"
③第三步 启动

上面配置好之后,启动HistoryServer:

[hadoop@hadoop001 sbin]$ pwd
/home/hadoop/app/spark-2.4.2-bin-2.6.0-cdh5.7.0/sbin

[hadoop@hadoop001 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-hadoop001.out
[hadoop@hadoop001 sbin]$ 

//jps看一下  多了个HistoryServer进程
[hadoop@hadoop001 sbin]$ jps
10544 ResourceManager
10112 NameNode
10641 NodeManager
16633 HistoryServer
10234 DataNode
10395 SecondaryNameNode
16684 Jps

//看一下日志说明启动成功了:
19/06/22 08:04:58 INFO Utils: Successfully started service on port 18080.
19/06/22 08:04:58 INFO HistoryServer: Bound HistoryServer to 0.0.0.0, and started at http://hadoop001:18080

//ps -ef看一下,可以看到它是一个java进程 还有其它参数 包括我们自己设置的
[hadoop@hadoop001 conf]$ ps -ef |grep HistoryServer
hadoop   16633     1  0 08:04 pts/0    00:00:22 /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/*:/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop/ -Dspark.history.fs.logDirectory=hdfs://hadoop001:9000/g6_directory -Xmx1g org.apache.spark.deploy.history.HistoryServer
hadoop   21772 21442  0 09:00 pts/1    00:00:00 grep HistoryServer
④第四步 访问

通过网址http://hadoop001:18080/来访问
在这里插入图片描述
可以看未完成的和完成的( completed and incomplete)应用程序,点击Show incomplete applications,
在这里插入图片描述
上面页面什么都没有,现在来run一个job看一下:

scala> sc.parallelize(List(1,2,3,4,5)).count
res0: Long = 5

再看一下页面,有了
在这里插入图片描述
(一个应用程序是由Application ID来代表的)
点击:local-1561162465170,跳到了这个页面:http://hadoop001:18080/history/local-1561162465170/jobs/,和正常的hadoop001:4040的页面一样
在这里插入图片描述
在所有这些web接口可以通过点击“表头”来对这些表格进行排序。这使得鉴别运行速度慢的任务、判别数据倾斜等很容易。
Spark作业完成completed 的信号的一种方法是显式停止Spark Context ( sc.stop() )。

⑤停止HistoryServer
//不需要的话可以这样停掉
[hadoop@hadoop001 sbin]$ ./stop-history-server.sh    
stopping org.apache.spark.deploy.history.HistoryServer

可以去这个目录看一下它的日志;

[hadoop@hadoop001 sbin]$ hdfs dfs -ls /g6_directory
Found 1 items
-rwxrwx---   1 hadoop supergroup        213 2019-06-22 08:14 /g6_directory/local-1561162465170.inprogress

可以看到它后缀是一个application id,如果有多个应用程序的话,就会有多个类似的文件,而且如果查看的话,会发现它是一个json格式的。下面访问的json格式的信息就是从这里来的,把这些信息放到页面上而已。

通过REST API进行监控

这种方式通过向REST发送一个请求,返回的是JSON格式的信息,这是以JSON来进行交互的。而上面的Web UI的监控方式都是页面定义好的。而通过这种REST API的监控,对于开发人员来说,可以自己去创建新的可视化和监视工具,定义自己想要的监控程序。
正在运行的程序,以前运行的程序,都可以使用REST API来监控。对于历史服务器,它们通常可以在http://hadoop001:18080/api/v1访问,对于正在运行的应用程序,可以在http://hadoop001:4040/api/v1访问。

一个应用程序是由Application ID来代表的:
在这里插入图片描述
获取所有的application的信息:
http://hadoop001:18080/api/v1/applications
在这里插入图片描述
获取正在跑或者完成的application

http://hadoop001:18080/api/v1/applications/?status=running
http://hadoop001:18080/api/v1/applications/?status=completed

获取某一具体的application:

http://hadoop001:18080/api/v1/applications/local-1561162465170

获取某一的application下面的jobs:

http://hadoop001:18080/api/v1/applications/local-1561162465170/jobs

在这里插入图片描述
查看某个应用下的某个job:

http://hadoop001:18080/api/v1/applications/local-1561162465170/jobs/1

在这里插入图片描述
只获取1条application
http://hadoop001:18080/api/v1/applications/?limit=1

还有其它有用的参数可以设置,比如Executor Task Metrics的很多参数,REST API 以任务执行的粒度 暴露了Task Metrics的值,Task Metrics它是由Spark executors收集的。这些指标可用于性能故障排除和工作负载描述。
更多参数可以看官网:
http://spark.apache.org/docs/latest/monitoring.html#rest-api

这种方式是给开发人员定制用的,需要和前端配合,需要什么样的定制,每个公司要求的UI界面不一样,UI设计好之后,交给前端,只需要告诉前端怎么调用这个接口就可以了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值