开题
hadoop-metrics2
其实是hadoop-common
工具包中的一个小模块,它设计了一个完整的metrics使用方案,工作中正好用到了,这里从代码层面分析下其设计思路,并不会贴大段大段的代码
代码分析
hadoop-metrics2
的整个流程都被封装到了MetricsSystem
中,随着这个类的启动,配置初始化->metrics生成->metrics投递的整个链路就串通了。
配置初始化
hadoop-metrics2
自己定义了一种配置,名字开头必须为hadoop-metrics2
,可以自定义尾缀,其中主要完成了MetricsSource
和MetricsSink
的一些配置,其中对MetricsSink
有非常重的依赖,由于hadoop-metrics2
将MetricsSink
实现了插件化,而这种插件化是通过SubsetConfiguration
完成初始化,所以这部分感觉使用起来并不是很灵活。
在MetricsSystem
正式启动之前,会先通过configure
的调用完成配置加载及初始化
metrics生成
所有被hadoop-metrics2
管理的数据源必须实现MetricsSource
接口:
|
|
实现好接口之后,你需要将其register
到MetricsSystem
中,之后它会对MetricsSource
进行简单的包装并管理起来
,MetricsSystem
启动之后会启动一个Timer
定时器来周期性执行Metircs
的流转,并且MetricsSystem
中生成的MetricsCollector
对象,会在各个MetricsSource
之间传递。
由于之前注册过了MetricsSource
,你的数据源就会在这时候被调用处理。
你可以在有数据变动的时候利用MetricsCollector
来构造MetricsRecordBuilder
并添加数据
这里再说一下MutableMetric
和MetricsRegistry
。
MetricsRegistry
用来管理hadoop-metrics2
的几种基本类型的Metircs
,如:Gauge
,Couter
,Stat
等,并且这些Metircs
都继承自MutableMetric
。
作为抽象父类的MutableMetric
的方法snapshot
很特别,他返回的是上一次的快照,并通过changed
来判定是否发生数据变化,这样只需要在数据变动的时候投递Metrics
,抽象类代码如下:
|
|
metrics投递
在前面完成Metrics
生成之后,MetricsSystem
会调用publishMetrics
方法来完成数据投递。
这里hadoop-metrics2
还做了点特别的工作。
一开始在完成配置加载后,MetricsSystem
对MetricsSink
进行了包装,生成了MetricsSinkAdapter
,这里主要是为了增加对Metrics
的吞吐量的管理。
每一个MetricsSinkAdapter
内部都有一个SinkQueue
用于数据缓冲并添加了重试逻辑。
由于之前添加的Sink都实现了MetricsSink
接口:
|
|
在具体实现的putMetrics
中你可以完成数据的具体操作,写文件也好,写DB也好,消息队列也好
总结
hadoop-metrics2
总体的设计思路很简洁,但是由于和hadoop-common
绑定太死,会很笨重,尤其在包冲突问题上表现明显。
另外作为一个二方包,仅仅作为数据投递,感觉设计的还是略微繁琐切易用性不够。
考虑到hadoop-metrics2
更多是为hadoop
社区服务,可能初衷就没考虑通用性,加上其逻辑并不复杂,完全可以参考思路自己实现一套轻量的Metrics
二方包。
这才是合理的造轮子。