spark metrics 源码分析
1) 主要核心类是 MetricsSystem
MetricsSystem 有三个主要成员:sources 、 sinks 、 registry
其余的有一些常驻的server sink,用于长期作为sink 获取 注册信息。
- sparkSubmit.runMain
- prepareSubmitEnvironment
将childMainClass 设置为 spark-submit --class 参数中的类
然后childMainClass 作为prepareSubmitEnvironment 的 返回
-
SparkSubmit.runMain
方法中 对 prepareSubmitEnvironment 返回的 childMainClass作判别
如果是SparkApplication的子类,就执行 子类
其他的就执行JavaMainApplication,直接执行spark-submit --class指定的 main类的main方法
- 应用的main方法中
-
SparkSession.builder()
返回一个 new Builder ,然后 getOrCreate 方法中
- new SparkContext
- sparkContext中会生成sparkEnv(sparkEnv (rpc endpoint )隶属于 sparkContext )
调用create 方法
在create方法中创建MetricsSystemInstances
2) sources
spark的每一个endpoint 都配备有自身的source,向metricsSystem发送消息
以ExecutorSource为例,
- executor初始化时候会new 一个 ExecutorSource
- ExecutorSource初始化时候,会将一系列指标 注册到MetricRegistry中,也就是codahale框架的MetricRegistry类对象中
- 然后向 sparkEnv中 metricSystems 注册 executorSource
- metricsSystem调用 registerSource 其实就是向 MetricsRegistry注册
-
executor.
run()结束后
更新相应的指标到 execuorSource中去
数据都被记录到 executorSource中去了
3) Sinks
以CSVSinks为例,
- CsvSinks 使用了 codahale 框架的 CsvReporter类
初始化绑定好文件后,
调用CsvReporter.start 开启 codahale .CsvReporter的Sink操作
- 然后
CsvSink.report 触发 CsvReporter.report方法,从metricRegistry中获取指标
CsvSink.report
CsvReporter.report
4) 总结
MetricSystems ≈ codahale .MetricRegistry (MetricSystem的其他内容就是register 和 start 、 stop 、 report 方法)
ExecutorSources ≈ 一系列 codahale 框架的指标,将这些指标注册到 codahale .MetricRegistry中
CSVSink ≈ codahale 框架的CSVReporter
MetricSystems.start ≈ source注册到MetricRegistry 、 Sink注册到MetricRegistry 、 Sinks.start(codahale 框架中 reporter.start) 方法
MetricSystems.start ≈ sinks.report ≈ MetricRegistry 相当于是一个容器,codahale.CsvReporter.report 触发指标的读取
综上,如果自写一套监控体系,我是可以办到的了