一、概述

Spark 任务在运行时,可以借助 SparkUI 对应用程序的 Job、Stage 以及 Executor 等的信息,从而了解整体任务的运行状态。

二、实现

Spark 提供了 Web 页面来浏览监控数据,而且 Master、Worker、Driver 根据自身功能提供了不同内容的 Web 监控页面。无论是 Master、Worker,还是 Driver,它们都使用了统一的 Web 框架 WebUI。Master、Worker 及 Driver 分别使用 MasterWebUI、WorkerWebUI 及 SparkUI 提供的 Web 界面服务,后三者都继承自 WebUI,并增加了个性化的功能。此外,在 YARN 或 Mesos 模式下还有 WebUI 的另一个扩展实现 HistoryServer。HistoryServer 将会展现已经运行完成的应用程序信息。

2.1. WebUI

SparkUI 构建在 WebUI 的框架体系之上,凡是需要页面展现的地方都可以继承它来完成。

2.1.1. WebUIPage

Web 界面由多个页面组成,每个页面都将提供不同的内容展示。WebUIPage 是 WebUI 框架体系的页节点,定义了所有页面应当遵循的规范。

  • $render()$ 方法用于渲染页面
  • $renderJson()$ 方法则用于生成对应的 JSON 字符串

2.1.2. WebUITab

有时候 Web 界面需要将多个页面作为一组内容放置在一起,标签页 WebUITab 定义了所有标签页的规范,并用于展现一组 WebUIPage。

2.2. SparkUI

2.2.1. 属性

  • killEnabled 由配置项 spark.ui.killEnabled 控制,如果为true,会在 UI 界面中展示强行杀掉 Spark Job 的开关。
  • appId: 当前的 Application ID。
  • streamingJobProgressListener: 用于 Spark Streaming 作业进度的监听器。

2.2.2. 方法

  1. WebUI 提供的 $attach/detach…$ 类方法

    • $attach/detachTab()$ 用于注册和移除 WebUITab
    • $attach/detachPage()$ 用于注册和移除 WebUIPage
    • $attach/detachHandler()$ 用于注册和移除 ServletContextHandler。
  2. $initialize()$ 用于初始化 WebUI 服务中的组件

    • 构建页面布局并给每个 WebUITab 中的所有 WebUIPage 创建对应的 ServletContextHandler。
    • 调用 $JettyUtils.createStaticHandler()$ 方法创建对静态目录 org/apache/spark/ui/static 提供文件服务的 ServletContextHandler,并使用$attachHandler()$ 方法追加到 SparkUI 的服务中。
    • 调用 $JettyUtils.createRedirectHandler()$ 方法创建几个将用户对源路径的请求重定向到目标路径的 ServletContextHandler。
  3. $bind()$ 启动与 WebUI 绑定的 Jetty 服务~

三、初始化 SparkUI

在 SparkContext 的初始化过程中,会创建 SparkUI。

1
2
3
4
5
6
_ui = if (conf.get(UI_ENABLED)) {
Some(SparkUI.create(Some(this), _statusStore, _conf, _env.securityManager, appName, "", startTime))
} else {
None
}
_ui.foreach(_.bind())

_statusStore 是初始化的 AppStatusStore,它是包装过的 KVStore 和 AppStatusListener,前者用于存储监控数据,后者注册到事件总线中的 appStatus 队列中。

1
2
3
val appStatusSource = AppStatusSource.createSource(conf)
_statusStore = AppStatusStore.createLiveStore(conf, appStatusSource)
listenerBus.addToStatusQueue(_statusStore.listener.get)

_env.securityManager 是 SparkEnv 中初始化的安全管理器。

SparkContext 通过调用 SparkUI 伴生对象中的 $create()$ 方法来直接 new 出 SparkUI 实例,然后调用 $bind()$ 方法将 SparkUI 绑定到 Jetty 服务~