阅读提示:阅读本文前,最好请阅读《Spark2.1.0——深入浅出度量系统》一文。
任何监控都离不开度量数据的采集,离线的数据采集很容易做到和被采集模块之间的解耦,但是对于实时度量数据,尤其是那些内存中数据的采集就很难解耦。这就类似于网页监控数据的埋点一样,你要在网页中加入一段额外的js代码(例如Google分析,即便你只是引入一个js文件,这很难让前端工程师感到开心)。还有一类监控,比如在Java Web中增加一个负责监控的Servlet或者一个基于Spring3.0的拦截器,这种方式虽然将耦合度从代码级别降低到配置级别,但却无法有效的对内存中的数据结构进行监控。Spark的度量系统对系统功能来说是在代码层面耦合的,这种牺牲对于能够换取对实时的、处于内存中的数据进行更有效的监控是值得的。
Spark将度量来源抽象为Source,其定义见代码清单1。
代码清单1 度量源的定义
private[spark] trait Source {
def sourceName: String
def metricRegistry: MetricRegistry
}
从代码清单1,可以看到Source是一个特质,其中定义了两个方法:
- sourceName:度量源的名称;
- metricRegistry:当前度量源的注册表。