文章目录
简介
MetricSystem通过一个特定的Instance
创建,由sources和sinks组成,并周期性地将source中的指标数据推送到目标sink中去。MetricSystem使用codahale提供的第三方测量仓库Metrics。MetricSystem中有三个主要概念:
- Instance:指定了谁在使用测量系统。目前在Spark中,已经实现的Instance有:master、worker、applications、driver、executor和shuffleService。
- Source:指定了从哪里收集测量数据。在指标系统中,有两种类型的souce:
- Spark internal source,如MasterSource和WorkerSource等,将会收集spark组件的内部状态。
- Common source,如JvmSource,将会收集低层状态,它们是通过configuration进行配置并利用反射进行加载。
- Sink:指定了往哪里发送测量数据。多个sinks可以共存,并且指标可以被同时发送给它们。Spark目前提供的Sink有ConsoleSink、CsvSink、JmxSink、MetricsServlet、GraphiteSink等。Spark中使用MetricsServlet作为默认的Sink。
指标的配置格式如下:
[instance].[sink|source].[name].[options] = xxxx
[instance]
:可以是master、worker、executor、driver或者applications,这意味着只有对应的instance
会有这个属性。通配符*
则意味着所有的instance
将会有这个属性。[sink|source]
:表明这个属性是属于source还是sink,这个部分的选项只能是source或sink。[name]
:表明sink或source的名称。[options]
:表示这个source或sink的特定属性。
下面以driver实例为例来介绍下MetricsSystem的创建与启动。
MetricsSystem的创建与启动
driver实例的MetricsSystem创建启动代码位于SparkContext类中。可以看到,创建好MetricsSystem后,则将所有的ServletContextHandler添加到Spark UI中,然后调用其start()
方法启动,最后注册其他几个source对象。
// 创建SparkEnv,在SparkEnv创建过程中创建MetricsSystem
_env = createSparkEnv(_conf, isLocal, listenerBus)
SparkEnv.set(_env)
// Driver的metrics system需要将app ID设置到spark.app.id属性值中,
// 因此它应该在我们从task scheduler中得到app ID(在SchedulerBackend构造函数中创建)并且设置spark.app.id属性后再启动
// 启动MetricsSystem
_env.metricsSystem.start()
// 在metrics system启动后,将driver metrics servlet handler添加到web ui中
_env.metricsSystem.getServletHandlers.foreach(handler => ui.foreach(_.attachHandler(handler)))
// 等待taskScheduler的backend就绪
_taskScheduler.postStartHook()
_env.metricsSystem.registerSource(_dagScheduler.metricsSource)
_env.metricsSystem.registerSource(new BlockManagerSource(_env.blockManager))
_executorAllocationManager.foreach { e =>
_env.metricsSystem.registerSource(e.executorAllocationManagerSource)
}
DAGSchedulerSource测量的信息是dagScheduler.failedStages、dagScheduler.runningStages、dagScheduler.waitingStages、dagScheduler.numTotalJobs、dagScheduler.activeJobs。
BlockManagerSource测量的信息是memory.maxMem_MB、memory.maxOnHeapMem_MB、memory.maxOffHeapMem_MB、memory.remainingMem_MB、memory.remainingOnHeapMem_MB、memory.remainingOffHeapMem_MB、memory.memUsed_MB、memory.onHeapMemUsed_MB、memory.offHeapMemUsed_MB、disk.diskSpaceUsed_