
2.6 使用Web UI监控Spark程序运行
Spark程序运行时,会创建 SparkContext 对象,一个 SparkContext 对象对应一个 Spark Application。同时,每个SparkContext对象对应一个Web UI,用来显示该Spark Application运行时的相关信息,包括以下信息。
●Spark Job信息;
●Spark Job的Stage和Task信息;
●Spark环境信息,包括运行时信息,Spark属性和系统属性等;
●运行的Executor信息。
有关Spark Job、Stage、Task等概念,在这里只需要明白在Web UI哪里查看这些参数即可。至于如何理解这些概念,请参考4.2节中的详细解释。
上述信息是调试、评估Spark程序的重要依据,因此Web UI非常重要。下面介绍Web UI的基本使用,示例步骤如下。
(1)运行spark-shell

访问Spark Web UI前,要先运行Spark程序,因为只有在创建了SparkContext对象后,才会启动对应的Web UI。spark-shell是一个特殊的Spark程序,它会创建一个SparkContext,并将对象引用赋值给sc。
(2)访问spark-shell对应的Web UI
在浏览器中输入http://192.168.0.226:4040,其中192.168.0.226是Driver节点的IP,4040是Web UI的监听端口,Web UI的起始端口是4040,如果同时有多个Spark Application运行,则Web UI的端口从4040、4041依次编号。
Web UI 的显示界面如图 2-12 所示,有 5 个显示项,分别是 Jobs、Stages、Storage、Enviroment和Executors。默认显示的是Jobs页面,由于目前还没有Spark Job运行,因此页面显示是空白的。

图2-12 Spark Web UI界面
(3)运行一个Spark Job
每个Spark Application都会有若干Spark Job,通过以下方式可以运行一个Spark Job。
在spark-shell中输入下面的代码,该代码将一个数组转换成RDD,并且对RDD的每个元素加一,最后将结果拉取到Driver端。

上面的代码中,collect是一个Action,它将触发一个Spark Job运行。
(4)在Web UI中查看Spark Job信息
单击图2-12中Jobs项,可以看到刚完成的Spark Job信息,如图2-13所示,新增了一项 Completed Jobs(1),下面列表中的信息则是刚完成的 Spark Job 信息,包括 Job Id,表示Job的编号;Description用来描述触发Job的Action;Submitted表示Spark Job的提交时刻;Duration表示Spark Job的执行所花费的时间;Stages:Succeeded/Total表示该Job中已经成功的Stages数和总的Stages数等。

图2-13 Spark已完成Job的界面图
Jobs页面中,除了显示已完成的Job信息,还会显示正在运行的Job和运行失败的Job信息。
(5)在Web UI中查看Spark Job的DAG图
单击图2-13中的collect at <console>:25链接,可以看到该Spark Job的详细信息,包括该Spark Job的DAG图,如图2-14所示。该DAG包含一个Stage:Stage0。

图2-14 Spark Job的DAG图
有关DAG和Stage等概念,在这里只需要明白在Web UI哪里查看即可。至于如何理解这些概念,请参考4.2节中的详细解释。
(6)在Web UI中查看Spark Job的Stages信息
一个 Spark Job 由若干 Stages 组成。单击 Web UI 主页上的 Stages 项,可以看到所有Spark Job 的 Stage,包括正在运行的 Stage、已经完成的 Stage 和失败的 Stage,如图 2-15所示。

图2-15 Spark Stages信息图
单击每个 Stage 的 Description 中的链接,可以查看该 Stage 的详细信息,包括该 Stage对应的Task信息,以及Task所在的Executor信息等。
有关Stage、Task等概念,在这里只需要明白在Web UI哪里查看即可。至于如何理解这些概念,请参考4.2节中的详细解释。
(7)在Web UI中查看Storage信息
Storage选项用来查看Spark Job中缓存的RDD信息。
首先在spark-shell中执行下面的代码,缓存numRDD。

单击图2-12中的Storage选项,可以看到numRDD的缓存情况,如图2-16所示。其中ID表示缓存的RDD的编号;RDD Name表示缓存的RDD的名字,它是以RDD类型命名的,如MapPartitionRDD;Storage Level表示RDD的缓存级别,本例中RDD缓存在内存中,并且只有1个副本;Cached Partition表示缓存的RDD Partition个数,本例中该RDD缓存的Partition有3个;Fraction Cached表示缓存率,本例中的缓存率为100%,表示全部都缓存完毕。

图2-16 Spark Storage信息图
将反复使用的 RDD 缓存起来,可以减少 RDD 的重复计算次数,降低计算开销。但是RDD缓存需要占用内存或磁盘资源,因此需谨慎使用。Web UI中的Storage信息可以帮助了解Spark程序运行过程中、RDD缓存情况和资源占用情况,单击RDD Name 列中的链接,还可以查看更加详细的信息。这些信息对于在Spark程序性能调优和程序调试时非常有用。
(8)在Web UI中查看Enviroment信息
单击图2-17中的Enviroment选项可以查看Spark环境信息。具体信息描述如下。
●运行时信息(Runtime Information):Java的版本,Java的Home目录,Scala版本;
●Spark 属性(Spark Properties):Spark Application 的 ID,Spark Application 的名字和Spark Application的相关配置等;
●系统属性,主要是JVM相关的设置;
●ClassPath为路径信息。

图2-17 Spark Environment信息图
(9)在Web UI中查看Executors信息
单击图2-12中的Executors选项,可以查看此次Spark Application的Executors信息。如图2-18 所示,可以查看每个Executor所在的节点IP,Executor 当前状态,Executor 的资源占用情况(内存、磁盘和 CPU 核),以及每个 Executor 的执行情况,如已经完成的 Task数、失败的 Task 数等。这些统计数据对充分了解执行此次 Spark Application 的物理集群情况,及对Spark程序的调优和错误定位有非常重要的作用。

图2-18 Spark Executors信息图