Hadoop Metrics1(转自:http://yangyoupeng-cn-fujitsu-com.iteye.com/)
HadoopMetrics
Hadoop内部包含一套对外开放的各种metrics接口支持。每一个hadoop的守护进程都可以被配置定期去收集其自身内部组件的数据信息,然后可以通过调用某些插件来处理这一批metrics。目前已经有很多与hadoop配套的插件,这些插件可以应用在一般的部署场景。相互联系的一部分metrics划归为context(上下文),每一个context都是可以被独立对待。一些context是针对所有的daemon,比如说JVM,RPC,
还有一些对应一些特殊的daemon,比如HDFSmetrics只能从namenode以及datanode中获得。在大多数情况下,当管理员需要监控hadoop集群,了解其性能,诊断问题的时候,hadoop提供的contexts会对管理员提供很大的帮助。
metricsystem已经经过一段时间的改进,取得了一些提高以及特色。在2010年4月,一个旨在解决现有metricssystem的问题的重构项目开始了。需要注意的事,新的metricssystem(现在被称为metric2)支持将metric信息发送给多个多个插件,以及能够通过多种方法进行过滤,对JMX提供了更多的支持。
在2011年下半年重构工作已经完成,并被纳入到apachehadoop0.20.205以及CDH4以后的版本中,之前的apachehadoop版本以及CDH版本还是使用初始的metrics实现。为了能够记述清晰,我们在描述特殊特性的时候,将早先的metric称为metric1,对于一些共通特征,我们将新旧两个版本都称为metrics。
ApacheHadoop0.20.0andCDH3(metrics1)
初始的metricssystem将相同的metric划归为context。一个context可以单独和某一个插件进行配置,这个插件的作用是定义这个metrics信息如何被处理。目前已经有很多插件,其中包括一个NullContexts,NullContext会忽略掉所有的metrics信息。某一daemon的内部组件会按照用户的定义的时间间隔拉取数据,被拉取的数据会被交个配置的插件进行管理。
下面是四个contexts。
jvm
包含了java虚拟机信息,以及metrics。比如说heapsize的最大值,已被占据的heap,垃圾回收的平均时间,所有的daemon都会产生这个contexts的metrics信息。
dfs:
包含了hdfs的metrics。metrics信息会因为daemon角色的不同而不同。例如:
NameNode提供整个HDFS容量(totalHDFScapacity)的信息,已被占用的容量(consumedcapacity),丢失副本的block数(missing-replicatedblocks,),需要进行复制的block数(under-replicatedblocks),集群中活跃的datanode数。
DataNode提供坏diskvolume的数目,剩余的capacity,只有HDFSdaemons输出这个context的metrics信息
mapred
包含mapredmetrics。这些metrics也会因为daemon角色的不同而不同。比如:
jobtracker提供的信息包括:map的数目,reduceslots的数目,要注意的tasktrackers(blacklistedtasktrackers),以及失败的tasktrackers的failures。而tasktrackers提供正在运行的,已经失败的,被kill的任务。只有MapReduce的daemon输出该context的metrics。
rpc包含了远程过程调用的metrics信息。比如每一个队列中RPC被处理之前的时间,打开的连接数,所有的daemon输出这个context的metrics信息。
虽然所有的Hadoop的部分都可以抓取这类信息,但是在默认情况下这些信息是不能被外部系统使用。用户必须为每一个context配置一个插件来完成处理这些信息的。metricssystem
的配置文件是hadoop-metrics.properties。该文件是一个简单的javaformat文件,并且可以做自由扩展。在该配置文件中有一些样例metrics插件:
org.apache.hadoop.metrics.spi.NullContext
这是hadoop为所有的contexts准备的默认的metrics插件,.NullContext就是一个/dev/null.在Hadoop内部是不会进行Metrics收集的,也不会输出到外部系统。实际上,这个插件会有效的禁制对metrics访问。
配置举例如下:
#hadoop-metrics.properties
jvm.class=org.apache.hadoop.metrics.spi.NullContext
dfs.class=org.apache.hadoop.metrics.spi.NullContext
org.apache.hadoop.metrics.spi.NoEmitMetricsContext
NoEmitMetricsContext是NullContext的一个轻微变种,只有一个重要的不同点。虽然所有的metrics不会输出到外部系统,但是这个线程会在hadoop中运行,而这个线程会更新内存中的metrics信息。
诸如JMX系统,metricsservlet,这些系统依赖这些被搜集的metrics信息。没有理由停用这个插件。
对system的监察非常重要,应该作为最小配置。更新metrics的配置文件,需要重新启动一个daemon,这会给系统增加负载,NoEmitMetricsContext的唯一参数是period。该参数定义了信息采集频率:
例如:
#hadoop-metrics.properties
jvm.class=org.apache.hadoop.metrics.spi.NoEmitMetricsContext
jvm.period=10
dfs.class=org.apache.hadoop.metrics.spi.NoEmitMetricsContext
dfs.period=10
org.apache.hadoop.metrics.file.FileContext
FileContext为了获得metrics而周期性测试hadoop内部组件,并且会将获得到的信息写入到localfilesystem中去,他包含两个参数:fileName(这是写入到文件名),periods,更新频率。
jvm.class=org.apache.hadoop.metrics.file.FileContext
jvm.period=10
jvm.fileName=/tmp/jvm-metrics.log
dfs.class=org.apache.hadoop.metrics.file.FileContext
dfs.period=10
dfs.fileName=/tmp/dfs-metrics.log
实际的讲,该插件是有缺点,他不会循环切换文件,会导致输出文件不断增加,所以不要在实际的生产集群中使用这个插件。还有一个缺点就是需要为每一个context都指定一个唯一的用户名。所以还是推荐NoEmitMetricsContext。
org.apache.hadoop.metrics.ganglia.GangliaContextandorg.apache.hadoop.metrics.ganglia.GangliaContext31
这两个插件,是hadoop为了开源监测系统ganglia提供第一个插件。ganglia是加州大学,Berkeley开发的,专门用于收集,聚合,探取大型集群系统的metrics信息。鉴于他的可扩展能力,ganglia和hadoop的集成是一个完美的系统。他通过在每一个节点上面运行一个小的daemon(gmond),gmond的作用是在每一个节点上面收集metrics信息。每一个gmond进程都依赖中中心的gmetad进程,该进程通过RRd记录数据信息,或者轮询的数据库文件,该文件是一种大小固定的,用以存储seriesdata,ganglia提供了一个php的web应用展示的数据信息。
GangliaContext通常被配置成向本地的gmond进程发送metrics信息,这些配置在配置文件中hadoop-metrics.properties发现。GangliaContext也同样有一个period的参数来定义采集频率。
#hadoop-metrics.properties
jvm.class=org.apache.hadoop.metrics.file.FileContext
jvm.period=10
jvm.servers=10.0.0.191
#Theservervaluemaybeacommaseparatedlistofhost:portpairs.
#Theportisoptional,inwhichcaseitdefaultsto8649.
#jvm.servers=gmond-host-a,gmond-host-b:8649
dfs.class=org.apache.hadoop.metrics.file.FileContext
dfs.period=10
dfs.servers=10.0.0.191
GangliaContextandGangliaContext31之间的不同支持,是前者是针对Ganglia3.0以及之前的版本低,而GangliaContext31支持Ganglia3.0之后的版。
JMXSupport
由于Hadoop是基于java的,所以从开发角度来说,支持JMX就成了一个理所当然的决定。
在一些监视系统中,特别是java内部的监视系统,都包含对JMX的支持类,JMX好的原因是他支持自描述的端点endpoint(比如开启了JMXclient),端点endpoint可以发现可用MBeans以及他们的属性,JMX术语,RPC栈,安全,以及配置都是非常巧妙,但是非常费解。
不管怎样,加入你知道,并且已经有系统支持JMX,那么这个作为一个非常完美的集成选项。
JMX功能与metrics插件之间联系是以一种不常见的方式。hadoop内部的MBeans依赖于metrics插件。使用默认的NullContext插件,虽然他会将JMXclient连接到Hadoopdaemon上面去,可以看到很多MBean,但是这些MBean不会被更新,这将给调试带了麻烦。
启动具有更新线程的插件,比如NoEmitMetricsContext,GangliaContext将会是Mbeans的信息得到正确展现。
RESTinterface
另外一个比较通用的获取hadoop的metrics信息的方式是使用一个运行在每一个hadoopdaemon中内嵌的web服务器内的叫REST/JSONservlet。Http服务,大量的JSON解析库,以及其简单性令这个接口成了一个非常好的选择。
一共有两周servlet,一个初始的metricsservlet,在/metrics中;一个是更新替代版本,位于/jmx.两者都提供相似的机能(一个HTTPget请求,产生JSON格式的返回,但是两者却用不同的工作方式在工作)。/metricsservlet直接使用Hadoopmetrics,只和metrics1配合使用,他在CDH3以及apachehadoop0.20.203之前的版本一直被使用,但是在这之后就停止使用了。新的/jmxservlet,将Hadoop的JMXMbeas以JSON的形式暴露给外部http系统。
Usingthemetricsservlet.
如果你定义了一个具有更新线程的插件,通过访问如下URl,将会获得一个文本形式的metrics信息:
[esammer@hadoop01:~]$curlhttp://hadoop117:50070/metrics
dfs
FSDirectory
{hostName=hadoop117,sessionId=}:
files_deleted=100
FSNamesystem
{hostName=hadoop117,sessionId=}:
BlockCapacity=2097152
BlocksTotal=9
CapacityRemainingGB=24
CapacityTotalGB=31
CapacityUsedGB=0
CorruptBlocks=0
ExcessBlocks=0
FilesTotal=33
MissingBlocks=0
PendingDeletionBlocks=0
PendingReplicationBlocks=0
ScheduledReplicationBlocks=0
TotalLoad=1
UnderReplicatedBlocks=1
namenode
{hostName=vm02.localdomain,sessionId=}:
AddBlockOps=1
CreateFileOps=1
DeleteFileOps=1
FileInfoOps=12
FilesAppended=0
通过使用http://hadoop117:50070/metrics?format=json,在后面添加format=JSON的形式,可以获取json形式的metrics信息。
[esammer@hadoop01:~]$curl'http://hadoop117:50070/metrics?format=json'
{"dfs":{
"FSDirectory":[
[{"hostName":"hadoop117","sessionId":""},{"files_deleted":100}]
],
"FSNamesystem":[
[
{"hostName":"hadoop117","sessionId":""},
{"BlockCapacity":2097152,"BlocksTotal":9,"CapacityRemainingGB":24,
"CapacityTotalGB":31,"CapacityUsedGB":0,"CorruptBlocks":0,"ExcessBlocks":0,
"FilesTotal":33,"MissingBlocks":0,"PendingDeletionBlocks":0,
UsingtheJMXJSONservlet.
被设计作为/metrics的替代品,/jmxservlet产生相同的输出,但是数据使用HadoopJMXMbeans中获得,而不是从metricssystem直接获得。/jmxservlet只支持JSON形式的输出:
[esammer@hadoop01:~]$curlhttp://hadoop117:50070/jmx
{
"name":"hadoop:service=NameNode,name=NameNodeActivity",
"modelerType":"org.apache.hadoop.hdfs.server.namenode.metrics.NameNodeActivtyMBean",
"AddBlockOps":0,
"fsImageLoadTime":2756,
"FilesRenamed":0,
"SyncsNumOps":0,
"SyncsAvgTime":0,
"SyncsMinTime":0,
"SyncsMaxTime":70,
"JournalTransactionsBatchedInSync":0,
"FileInfoOps":0,
"CreateFileOps":0,
"GetListingOps":0,
"TransactionsNumOps":0,
"TransactionsAvgTime":0,
"TransactionsMinTime":0,
"TransactionsMaxTime":1,
"GetBlockLocations":0,
"BlocksCorrupted":0,
"FilesInGetListingOps":0,
"SafemodeTime":40117,
"FilesCreated":0,
"FilesAppended":0,
"DeleteFileOps":0,
"blockReportNumOps":0,
"blockReportAvgTime":0,
"blockReportMinTime":0,
"blockReportMaxTime":3
},{
"name":"java.lang:type=Threading",
"modelerType":"sun.management.ThreadImpl",
"ThreadContentionMonitoringEnabled":false,
"DaemonThreadCount":29,
"PeakThreadCount":38,
"CurrentThreadCpuTimeSupported":true,
"ObjectMonitorUsageSupported":true,
"SynchronizerUsageSupported":true,
"ThreadContentionMonitoringSupported":true,
"ThreadCpuTimeEnabled":true,
...