Spark源码阅读02-Spark核心原理之监控管理

监控管理

    • 监控管理
    • UI监控
      • 实时UI监控
      • 历史UI监控
    • Metrics
      • 输入源(Metrics Source)介绍
      • 输出方式(Metrics Sink)介绍
    • TEST

监控管理

Spark提供了UI监控、Spark Metrics和REST 3种方式监控应用程序运行状态。其中:

  • UI 监控以网页方式提供用户监控调度阶段、存储、运行环境和Executor参数等信息
  • Spark Metrics通过定制的方式,将应用程序的运行情况以多种方式展现出来,
  • REST则提供API给用户,根据API开发监控应用程序运行的各阶段消息

UI监控

Spark的UI监控分为实时UI监控和历史UI监控,默认情况下启动实时UI监控,历史UI监控需要手动启动。其中:

  • 实时UI监控可以即时刷新查看作业的运行情况
  • 历史UI监控则是保存了应用程序的运行状态数据,根据用户需要查询这些应用程序的历史运行情况

实时UI监控

实时UI监控分为MasterUl监控和应用程序UI监控,其中

  • MasterUI监控在Master启动过程中启用,
  • 应用程序UR监控在SparkContext启用。

以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监控页面

在Master UI监控页面上有四部分内容,界面截图如下:
Spark源码阅读02-Spark核心原理之监控管理_第1张图片

其中:

  • ① Master概要信息: 内容包括集群Master的访问地址和 REST访问地址, 集群的可用 Worker节点数、 CPU核数、 内存总量、 正在运行/完成运行的应用数量和集群Master的状态等。
  • ② 集群的 Worker 列表:运行在集群中的 Worker 节点列表,显示内容包括 Worker 的编号、访问地址 (IP 地址和端口)、 节点状态、CPU 核数和内存大小等信息, 其中 CPU 核数和内存同时显示了总量和使用盘。
  • ③ 正在运行的应用程序: 显示正在运行在集群中的应用程序列表, 显示内容包括应用程序的编号、名称、使用的 CPU 核数、每个 Worker 节点平均使用内存大小、提交时间、 提交用户、 运行状态和运行耗时等信息。 通过单击应用程序的编号或名称能够看到该应用程序作业和调度阶段的运行情况。
  • ④ 完成运行的应用程序: 显示已经完成运行的应用程序, 已经运行状态包括成功和失败两种情况,显示内容和正在运行的应用程序的显示内容相同

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)作业监控页面

在该监控页面中显示了作业的运行情况, 内容包括作业的概要信息、 事件时间轴视图、正运行的作业和已成功运行的作业等信息。
Spark源码阅读02-Spark核心原理之监控管理_第2张图片
点击 Completed Jobs的Description下面的内容,可以看该job的运行细节,包括其执行的DAG图。
Spark源码阅读02-Spark核心原理之监控管理_第3张图片

(2)调度阶段监控页面

在该监控页面中显示了应用程序调度阶段的运行情况, 内容包括调度阶段概要信息、 正在运行的调度阶段、 已成功运行的调度阶段和运行失败的调度阶段等4个部分。 在调度阶段概要 信息中, 显示了该应用程序运行耗时、采用的调度模式, 以及正在运行/已成功运行/运行失败的调度阶段的数量。
Spark源码阅读02-Spark核心原理之监控管理_第4张图片
点击Description下面的内容,可以具体看到某个调度阶段的详细内容。在页面中显示了该调度阶段中任务运行的总体信息、 Executor运行信息和任务的详细运行情况。
Spark源码阅读02-Spark核心原理之监控管理_第5张图片
(3)存储监控页面

Spark 中如果 RDD 进行了缓存, 则该情况可以通过存储监控页面进行查看, 监控的内容包括缓存 RDD 名称、存储级别、缓存 Partition 数、 缓存百分比、缓存内存数据大小、缓存 Alluxio 数据大小和存入磁盘数据大小。
在这里插入图片描述
(4) 运行环境监控页面

在该页面中显示了 Spark 的运行环境, 内容包括运行时信息、 系统参数和 Spark 参数等信息。 通过该页面可以确认运行环境以及 Spark 设置的参数是否正确。
Spark源码阅读02-Spark核心原理之监控管理_第6张图片
(5) Executor 监控页面

在该页面中先显示了 Spark 集群中运行的 Driver 和 Executor 列表,记录了 Driver 和 Executor基本信息, 如编号、 地址信息和 RDD 数据块个数; 另一方面也记录了在应用程序运行期间的参数, 如内存使用情况、 磁盘使用情况和正在运行/成功完成/失败任务数、 输入数据量、 Shuffle读数据量和 Shuffle 写数据量。
Spark源码阅读02-Spark核心原理之监控管理_第7张图片

历史UI监控

默认情况下Spark没有打开历史UI监控功能,当Spark集群重启时,之前运行的应用程序状态信息不能够访问。此时需要打开Spark历史Ul监控配置,配置过程可参考博客。
Spark源码阅读02-Spark核心原理之监控管理_第8张图片

Metrics

Spark内置了一个可配置的度量系统(Metrics),它是基于Coda Hale的 Metrics库构建的,能够将Spark 内部状态通过HTTP、JMX、CSV等形式呈现给用户。同时,用户也可以以插件的方式将自己实现的数据源(Metrics Source)和数据输出方式(Metrics Sink)添加到Metrics 系统中,从而获取自己需要的据。
在Metrics系统中有两个重要的概念: Metrics Soure 和 Metrics Sink 通过这两个概念定义了Metrics系统的输入和输出。其中:

  • Metrics Source:定义了所需要采集的各种 Metrics,以及如何采集这些 Metrics。这些定义好的Metrics会注册到Metrics系统内部以备使用。
  • Metrics Slink:定义了Metrics的输出行为,采集到的数据以何种方式呈现给用户

下图显示了Metrics系统各模块之间的关系,Metrics Source和 Metrics Slink 以插件的形式被Metrics系统所管理,通过MetricsConfig 配置属性启动相应的插件。
Spark源码阅读02-Spark核心原理之监控管理_第9张图片
Metrics系统配置文件为$Spark/conff metrics.properties, 配置项格式如下, 不符合规则配置项系统将忽略。

[instance].sink I source. [name]. [options]=value
  • instance:表示 Spark 内部监控的不同对象,在Spark定义了Master、 Worker、Executor、 Driver和Applications种对象 。用户可以使用通配符*表示所有对象 ,不过配置项有更详细的描述, 则通配符设置值将被覆盖, 如下配置中: *sink.console. period和 *.sink.console. unit 将被master.sink.console. period和master.sink.console. unit所覆盖。
*.sink.console.period = 1O 
*.sink.console.unit = seconds 
master.sink.console.period = 15 
maser.sink.console.unit = seconds
  • sink I source: 设置采集数据输出方式和采集数据源。
  • name: 该名称由用户定义, 表示sink或 source名称。 在如下配置项中, 配置了获取的度量数据以CSV的形式输出。
*.sink.csv.class = org.apache.spark.metrics.sink.CsvSink 
*.sink.csv.period = 1
*.sink.csv.unit = minutes 
*.sink.csv.directory = /tmp/
  • option:定义了配置项的名称和对应值,在下面的配置项中,配置不同对象数据源名称和对应值。
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

输入源(Metrics Source)介绍

在Spark中内置了6种Metrics Source,这些数据源在Master启动或应用程序启动时会随之启动, 具体如下:

  • MasterSource: 主要统计连接的Worker/可用的Worker数量 、提交应用程序 /等待应用 程序数等 Master信息。
  • ApplicationSource: 统计应用程序运行状态、 运行时间和使用的CPU核数等信息。
  • WorkerSource: 统计 Worker节点中运行Executor信息、 使用/剩余CPU核数和使用/剩余内存大小等信息。
  • ExecutorSource: Executor中正在处理任务、 已经完成任务、 线程池总量和使用批等统计信息, 如果使用HDFS文件系统, 则统计其读数据、 写数据等统计信息。
  • DAGSchedulerSource: 统计作业总数和正在运行作业数量, 同时统计正在运行、 等待和失败的调度阶段。
  • BlockManagerSource: 统计内存总量、 已使用和剩余的内存大小以及使用磁盘空间大小。

除了内置的Metrics Source外, 用户还可以通过自定义方式进行设置数据源。定义时使用 Metrics 系统通用的 Metrics Source, 如 JvmSource, 通过该配置项表示Driver 对象将加载 JvmSource, 配置方式如下:

river.source.jvm.class=org.apache.spark.metrics.source.JvmSource 

输出方式(Metrics Sink)介绍

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:

  • ConsoleSink: 把获取的Metrics数据输出到终端上。
  • CsvSink: 把获取的Metrics数据定期保存为CSV义件。
  • GangliaSink: 把获取的Metrics数据传输给Ganglia监控系统, 用于图形等方式展现。
  • GraphiteSink: 把获取的Metrics数据传输给Graphite监控系统,用于图形等方式展现。
  • JmxSink: 用于图形等方式以JavaBean的形式输出,可以通过JmxConsole等工具进行查看。

下面配置项配置了使用 CSV文件保存Metrics数据:

*.sink.csv.class=org.apache.spark.metrics.sink.CsvSink

TEST

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)应用程序信息

  • /applications: 显示所有的应用程序列表

(2)作业信息

  • /applications/[app-id]/jobs: 获取给定应用程序的所有Jobs
  • /applications/[app-id]/jobs/[job-id]:获取给定Job的信息

(3)调度阶段信息

  • /applications/[app-id]/stages: 获取给定应用程序的所有stages
  • /applications/[app-id]/stages/[stage-id]:获取给定stages的所有attempts
  • /applications/[app-id]/stages/[stage-id]/[stage-attempt-id]:获取给定stages attempts的信息
  • /applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/taskSummary:获取给定stage attempt中所有tasks的metrics信息
  • /applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/taskList:获取给定stage attempt 的所有tasks

(4)Executor信息

  • applications/[app-id]/executors: 获取给定应用程序的所有Executors

(5)存储信息

  • /applications/[app-id]/storage/rdd: 获取给定应用程序的所有缓存的RDDs
  • /applications/[app-id]/storage/rdd/[rdd-id]:获取给定RDDs的存储状态详情

如果当应用程序运行在YARN模式,每个应用程序将有多个attempts,需要将上面所有[app-id]改成[app-id]/[attempt-id]。上面所有的URL都是有版本的,这样将使得开发者们很容易在上面开发应用程序。

你可能感兴趣的