10.2.3 Metrics

事实上,除了Hadoop自带的日志功能以外,还有很多其他可以扩展的Hadoop监控程序供管理员使用。在介绍这些监控工具之前,先对系统的可度量信息(Metrics)进行简单讲解。

HDFS及MapReduce的守护进程会按照一定的规则来收集系统的度量信息。我们将这种度量规则称为Metrics。例如,DataNode会收集如下度量信息:写入的字节数、被复制的文件块数及来自客户端的请求数等。

Metrics属于一个上下文,当前Hadoop拥有dfs、mapred、rpc、jvm等上下文。Hadoop守护进程会收集多个上下文的度量信息。所谓上下文即应用程序进入系统执行时,系统为用户提供的一个完整的运行时环境。进程的运行时环境是由它的程序代码和程序运行所需要的数据结构以及硬件环境组成的。

这里我们认为,一个上下文定义了一个单元,比如,可以选择获取dfs上下文或jvm上下文。我们可以通过配置conf/hadoopmetrics.properties文件设定Metrics。在默认情况下,会将所有上下文都配置为NullContext类,这代表它们不会发布任何Metrics。下面是配置文件的默认配置情况:


dfs.class=org.apache.hadoop.metrics.spi.NullContext

mapred.class=org.apache.hadoop.metrics.spi.NullContext

jvm.class=org.apache.hadoop.metrics.spi.NullContext

rpc.class=org.apache.hadoop.metrics.spi.NullContext


其中每一行都针对一个不同的上下文单元,同时每一行定义了处理此上下文Metrics的类。这里的类必须是MetricsContext接口的一个实现;在上面的例子中,这些NullContext类正如其名,什么都不做,既不发布也不更新它们的Metrics。

下面我们来介绍MetricsContext接口的实现。

1.FileContext

利用FileContext可将Metrics写入本地文件。FileContext拥有两个属性:fileName—定义文件的名称,period—指定文件更新的间隔。这两个属性都是可选的,如果不进行设置,那么Metrics每隔5秒就会写入标准输出。

配置属性将应用于指定的上下文中,并通过在上下文名称后附加点“.”及属性名进行标示。比如,为了将jvm导出一个文件,我们会通过以下方法调整它的配置:


jvm.class=org.apache.hadoop.metrics.file.FileContext

jvm.fileName=/tmp/jvm_metrics.log


其中,第一行使用FileContex来改变jvm的上下文,第二行将jvm上下文导出临时文件。

需要注意的是,FileContext非常适合于本地系统的调试,但是它并不适合在大型集群中使用,因为它的输出文件会被分散到集群中,使分析的时间成本变得很高。

2.GangliaContext

Ganglia(http://ganglia. info/)是一个开源的分布式监控系统,主要应用于大型分布式集群的监控。通过它可以更好地监控和调整集群中每个机器节点的资源分配。Ganglia本身会收集一些监控信息,包括CPU和内存使用率等。通过使用GangliaContext我们可以非常方便地将Hadoop的一些测量内容注入Ganglia中。此外,GangliaContext有一个必须的属性—servers,它的属性值是通过空格或逗号分隔的Ganglia服务器主机地址:端口。我们将在10.2.5节中进行详细讲解。

3.NullContextWithUpdateThread

通过前面的介绍,我们会发现FileContext和GangliaContext都将Metrics推广到外部系统。而Hadoop内部度量信息的获取需要另外的工具,比如著名的Java管理扩展(Java Management Extensions, JMX),JMX中的NullContextWithUpdateThread就是用来解决这个问题的(我们将在后面进行详细讲解)。和NullContext相似,它不会发布任何Mertics,但是它会运行一个定时器周期性地更新内存中的Metrics,以保证另外的系统可以获得最新的Metrics。

除NullContextWithUpdateThread外,所有MetricsContext都会执行这种在内存中定时更新的方法,所以只有当不使用其他输出进行Metrics收集时,才需要使用NullContext-WithUpdateThread。举例来说,如果之前正在使用GangliaContext,那么随后只要确认Metrics是否被更新,而且只需要使用JMX,不用进一步对Metrics系统进行配置。

4.CompositeContext

CompositeContext允许我们输出多个上下文中的相同的Metrics,比如下面的这个例子:


jvm.class=org.apache.hadoop.metrics.spi.CompositeContext

jvm.arity=2

jvm.sub1.class=org.apache.hadoop.metrics.file.FileContext

jvm.fileName=/tmp/jvm_metrics.log

jvm.sub2.class=org.apache.hadoop.metrics.ganglia.GangliaContext

jvm.servers=ip-10-70-20-111.ec2.internal:8699


其中arity属性用来定义子上下文数量,在这里它的值为2。所有子上下文的属性名称都可以使用下面的句子设置:jvm.sub1.class=org.apache.hadoop.metrics.file.FileContext。