Spark提供了UI监控、Spark Metrics和REST 3种方式监控应用程序运行状态。其中:
Spark的UI监控分为实时UI监控和历史UI监控,默认情况下启动实时UI监控,历史UI监控需要手动启动。其中:
实时UI监控分为MasterUl监控和应用程序UI监控,其中
以Standalone为例, 在Master启动的时候会启动UI监控和REST服务,MasterUl监控默认使用8080端口,访问地址为http//host:8080, 同时启动Master和应用程序的Metrics服务。具体代码实现如下:
override def onStart(): Unit = {
logInfo("Starting Spark master at " + masterUrl)
logInfo(s"Running Spark version ${org.apache.spark.SPARK_VERSION}")
//启动Master的UI监控界面,其中HTTP服务由Jetty进行提供
webUi = new MasterWebUI(this, webUiPort)
//默认使用8080端口,访问地址为http://host:8080
webUi.bind()
masterWebUiUrl = "http://" + masterPublicAddress + ":" + webUi.boundPort
if (reverseProxy) {
masterWebUiUrl = conf.get("spark.ui.reverseProxyUrl", masterWebUiUrl)
webUi.addProxy()
logInfo(s"Spark Master is acting as a reverse proxy. Master, Workers and " +
s"Applications UIs are available at $masterWebUiUrl")
}
checkForWorkerTimeOutTask = forwardMessageThread.scheduleAtFixedRate(new Runnable {
override def run(): Unit = Utils.tryLogNonFatalError {
self.send(CheckForWorkerTimeOut)
}
}, 0, WORKER_TIMEOUT_MS, TimeUnit.MILLISECONDS)
//启动REST服务,默认端口为4040
if (restServerEnabled) {
val port = conf.getInt("spark.master.rest.port", 6066)
restServer = Some(new StandaloneRestServer(address.host, port, conf, self, masterUrl))
}
restServerBoundPort = restServer.map(_.start())
//启动Master和应用程序的Metrics服务,把Master UI监控句柄注入到Master和应用程序的
//Metrics服务中,这样Master监控信息会同时发送到Master和应用程序的Metrics中
masterMetricsSystem.registerSource(masterSource)
masterMetricsSystem.start()
applicationMetricsSystem.start()
// Attach the master and app metrics servlet handler to the web ui after the metrics systems are
// started.
masterMetricsSystem.getServletHandlers.foreach(webUi.attachHandler)
applicationMetricsSystem.getServletHandlers.foreach(webUi.attachHandler)
...
}
...
}
Master UI监控页面
其中:
SparkContext 启动时, 启动应用程序的 Ul 监控界面, 默认端口为 4040, 访问地址为 http://host:4040, 其启动代码在SparkContext 实现如下:
_ui =
//默认情况下启动应用程序的UI监控,用于监控作业处理状态
if (conf.getBoolean("spark.ui.enabled", true)) {
Some(SparkUI.create(Some(this), _statusStore, _conf, _env.securityManager, appName, "",
startTime))
} else {
// For tests, do not enable the UI
None
}
// Bind the UI before starting the task scheduler to communicate
// the bound port to the cluster manager properly
//如果端口被占用会逐步递增直至可用,默认端口为4040
_ui.foreach(_.bind())
_hadoopConfiguration = SparkHadoopUtil.get.newConfiguration(_conf)
// Add each JAR given through the constructor
if (jars != null) {
jars.foreach(addJar)
}
if (files != null) {
files.foreach(addFile)
}
应用程序 UI 监控
应用程序 UI 监控一般包括作业、调度阶段、 存储、 运行环境、Executor和SQL等信息,在SparkStreaming中会增加Streaming监控信息。其还有事件时间轴、执行DAG和SparkStreaming统计3个视图,使得监控更为直观, 可视化视图更加具体。
(1)作业监控页面
在该监控页面中显示了作业的运行情况, 内容包括作业的概要信息、 事件时间轴视图、正运行的作业和已成功运行的作业等信息。
点击 Completed Jobs的Description下面的内容,可以看该job的运行细节,包括其执行的DAG图。
(2)调度阶段监控页面
在该监控页面中显示了应用程序调度阶段的运行情况, 内容包括调度阶段概要信息、 正在运行的调度阶段、 已成功运行的调度阶段和运行失败的调度阶段等4个部分。 在调度阶段概要 信息中, 显示了该应用程序运行耗时、采用的调度模式, 以及正在运行/已成功运行/运行失败的调度阶段的数量。
点击Description下面的内容,可以具体看到某个调度阶段的详细内容。在页面中显示了该调度阶段中任务运行的总体信息、 Executor运行信息和任务的详细运行情况。
(3)存储监控页面
Spark 中如果 RDD 进行了缓存, 则该情况可以通过存储监控页面进行查看, 监控的内容包括缓存 RDD 名称、存储级别、缓存 Partition 数、 缓存百分比、缓存内存数据大小、缓存 Alluxio 数据大小和存入磁盘数据大小。
(4) 运行环境监控页面
在该页面中显示了 Spark 的运行环境, 内容包括运行时信息、 系统参数和 Spark 参数等信息。 通过该页面可以确认运行环境以及 Spark 设置的参数是否正确。
(5) Executor 监控页面
在该页面中先显示了 Spark 集群中运行的 Driver 和 Executor 列表,记录了 Driver 和 Executor基本信息, 如编号、 地址信息和 RDD 数据块个数; 另一方面也记录了在应用程序运行期间的参数, 如内存使用情况、 磁盘使用情况和正在运行/成功完成/失败任务数、 输入数据量、 Shuffle读数据量和 Shuffle 写数据量。
默认情况下Spark没有打开历史UI监控功能,当Spark集群重启时,之前运行的应用程序状态信息不能够访问。此时需要打开Spark历史Ul监控配置,配置过程可参考博客。
Spark内置了一个可配置的度量系统(Metrics),它是基于Coda Hale的 Metrics库构建的,能够将Spark 内部状态通过HTTP、JMX、CSV等形式呈现给用户。同时,用户也可以以插件的方式将自己实现的数据源(Metrics Source)和数据输出方式(Metrics Sink)添加到Metrics 系统中,从而获取自己需要的据。
在Metrics系统中有两个重要的概念: Metrics Soure 和 Metrics Sink 通过这两个概念定义了Metrics系统的输入和输出。其中:
下图显示了Metrics系统各模块之间的关系,Metrics Source和 Metrics Slink 以插件的形式被Metrics系统所管理,通过MetricsConfig 配置属性启动相应的插件。
Metrics系统配置文件为$Spark/conff metrics.properties, 配置项格式如下, 不符合规则配置项系统将忽略。
[instance].sink I source. [name]. [options]=value
*.sink.console.period = 1O
*.sink.console.unit = seconds
master.sink.console.period = 15
maser.sink.console.unit = seconds
*.sink.csv.class = org.apache.spark.metrics.sink.CsvSink
*.sink.csv.period = 1
*.sink.csv.unit = minutes
*.sink.csv.directory = /tmp/
master.source.jvm.class = org.apache.spark.metrics.source.JvmSource
worker.source.jvm.class = org.apache.spark.me七rics.source.JvmSource
driver.source.jvm.class = org.apache.spark.metrics.source.JvmSource
executor.source.jvm.class = org.apache.spark.metrics.source.JvmSource
在Spark中内置了6种Metrics Source,这些数据源在Master启动或应用程序启动时会随之启动, 具体如下:
除了内置的Metrics Source外, 用户还可以通过自定义方式进行设置数据源。定义时使用 Metrics 系统通用的 Metrics Source, 如 JvmSource, 通过该配置项表示Driver 对象将加载 JvmSource, 配置方式如下:
river.source.jvm.class=org.apache.spark.metrics.source.JvmSource
Spark在Metrics系统中内置了MetricsServlet,类似于Metrics Source,在程序启动时自动加载Metrics Sink。 该Metrics Sink可以通过发送HTTP请求 “ /metrics/json",以JSON格式获取监控的Metrics数据, 如发送 “ /metrics/master/json"和 “ /metrics/applications/json"可以分别获得Master对象和Application对象的度量数据。 另外可以通过自定义方式配置Metrics Sink, 此时配置项值需要以 “ class"结尾, 通过反射机制加载到Metrics系统中。
Spark 的Metrics系统提供如下几种可以配置的Metrics Sink:
下面配置项配置了使用 CSV文件保存Metrics数据:
*.sink.csv.class=org.apache.spark.metrics.sink.CsvSink
REST是 一种基于网络的软件架构设计风格, 其英文全称是Representational State Tranfer,翻译成中文为 ”表述性状态转移 "。对REST更通俗的解释就是:它是软件架构的一种分类, 把具有某一组特征的软件架构设计称为REST架构约束。 基于Web的架构, 实际上就是各种规范的集合, 这些规范共同组成了Web架构。 RESTful Web Services使用REST架构风格构建的服务,由于其轻量的特性和在HTTP上直接传输数据的能力,在互联网服务部署技术的选择上,使用RESTful风格构建服务正在逐渐成为基于SOAP技术的有力挑战者。
REST API 中 API返回的信息是JSON格式的,开发者们可以很方便地通过这个APl来创建可视化的Spark监控工具。该个API支待正在运行的应用程序,通过http://host:4040/api/v1 来获取一些信息,同时也支持历史服务器,访问地址为http://host:18080/api/vl。现有Spark提供如下REST API:
(1)应用程序信息
(2)作业信息
(3)调度阶段信息
(4)Executor信息
(5)存储信息
如果当应用程序运行在YARN模式,每个应用程序将有多个attempts,需要将上面所有[app-id]改成[app-id]/[attempt-id]。上面所有的URL都是有版本的,这样将使得开发者们很容易在上面开发应用程序。