hadoop metrics2源码分析

 设计文档看这里http://wiki.apache.org/hadoop/HADOOP-6728-MetricsV2。
    最近做项目码代码的时候想着是否可以实现一个子系统来监测整个项目的运行情况,虽说也不是什么了不起的大项目,但有这么个功能总归是好的,也顺便提升一下自己的软件设计的能力。以前就大致看过hadoop metrics 子系统的代码实现,趁这个机会,我又仔细去调了一下namenode的启动过程,不过主要集中注意力在metrics系统的实现上。下面就简单总结一下吧。

    hadoop metrics系统整体架构上采用的是生产者消费者模式(ps:这点不用看源码,猜也能猜到,肯定有产生metrics的源头和消费metrics的东西存在),源头对应的接口是MetricsSource类,消费metrics的接口是MetricsSink类。hadoop源码中实现了两种类型的sink,ganglia和file,也就是说我们可以把metrics传给ganglia和文件,当然也可以自己实现sink,往更多的目的地写,我调的时候就配了一个文件。

    对于metrics system而言,并不是直接操作source和sink的,还有两个适配器类MetricsSourceAdapter和MetricsSinkAdapter,他们分别包装了source和sink,一对一的关系,但在adapter里还有filter的存在,用以过滤从source里get到的metrics和流向sink的metrics。metrics系统运行时会遍历所有的的sink,因此每个source里的metrics会发到多个sink中,不过还有metricsFilter对metrics进行过滤。

    再来说说metricsSystem是怎样从source里get到metrics的。metrics系统里有一个MetricsCollectorImpl类,顾名思义,该类就是用来收集metrics的,当调用source的getMetrics()方法时,会先将收集到的metrics放入这个collector中,然后返回collector中的Iterable,返回后metricsSystem将Iterable放入metricsBuffer中。至此,metrics的收集工作完毕。

    最后该说说metrics系统sink的工作流程了。metrics系统拿到metricsBuffer后,调用sinkAdapter的putMetrics()方法,这里并没有做filter的逻辑,只是将metricsBuffer放入一个sinkquene的队列里。MetricsSinkAdapter实现了SinkQueue.Consumer,消费metricsBuffer的逻辑在实现自Consumer接口的consume()方法里。sinkAdapter里有一个守护线层,不断的从sinkQuene里取metricsBuffer,然后consume,filter的逻辑是在consume()里做的,经过filter过滤出的metrics才会用来去调用fileSink的putmetrics()方法,至此,metrics就写入到文件里了。

 

    哎,真搞不懂hadoop的metrics系统为毛实现得这么复杂,感觉metrics从source到sink之间要经过好多步骤。要是让我实现得花,简简单单的一个生产者消费者模式完事,哪来这么多过滤。不过对于hadoop这样的大型系统而言,考虑得全面还是有必要的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值