Spark-源码系列-SparkCore-UI
一、概述
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. 方法
WebUI 提供的 $attach/detach…$ 类方法
- $attach/detachTab()$ 用于注册和移除 WebUITab
- $attach/detachPage()$ 用于注册和移除 WebUIPage
- $attach/detachHandler()$ 用于注册和移除 ServletContextHandler。
$initialize()$ 用于初始化 WebUI 服务中的组件
- 构建页面布局并给每个 WebUITab 中的所有 WebUIPage 创建对应的 ServletContextHandler。
- 调用 $JettyUtils.createStaticHandler()$ 方法创建对静态目录
org/apache/spark/ui/static
提供文件服务的 ServletContextHandler,并使用$attachHandler()$ 方法追加到 SparkUI 的服务中。 - 调用 $JettyUtils.createRedirectHandler()$ 方法创建几个将用户对源路径的请求重定向到目标路径的 ServletContextHandler。
$bind()$ 启动与 WebUI 绑定的 Jetty 服务~
三、初始化 SparkUI
在 SparkContext 的初始化过程中,会创建 SparkUI。
1 | _ui = if (conf.get(UI_ENABLED)) { |
_statusStore
是初始化的 AppStatusStore,它是包装过的 KVStore 和 AppStatusListener,前者用于存储监控数据,后者注册到事件总线中的 appStatus 队列中。
1 | val appStatusSource = AppStatusSource.createSource(conf) |
_env.securityManager
是 SparkEnv 中初始化的安全管理器。
SparkContext 通过调用 SparkUI 伴生对象中的 $create()$ 方法来直接 new 出 SparkUI 实例,然后调用 $bind()$ 方法将 SparkUI 绑定到 Jetty 服务~