Hadoop教程

监控

监控是系统管理的重要内容。在本节中,我们概述Hadoop的监控工具,看看它们 如何与外部监控系统相结合。

监控的目标在于检测集群在何时未提供所期望的服务。主守护进程是最需要监控 的,包括主 namenode、辅助 namenode 和 jobtracker。datanode 和 tasktracker 经常 出现故障,在大型集群中,故障率尤其髙。因此,集群需要保留额外的容量,如此 一来,即使有一小部分节点宕机,也不影响整个系统的运作。

除了使用即被介绍的工具外,管理员还可以定期运行一些测试作业,以检查集群的 健康状况。

能够监控Hadoop的工具(或方法)有很多,但限于篇幅,本书无法一一介绍。例 如,Chukwa是一个数据集合,也是基于HDFS和MapReduce的监控系统,它在 挖掘日志数据、发现大规模趋势方面具有优势。

曰志

所有Hadoop守护进程都会产生日志文件,这些文件非常有助于查明系统中发生的 事件。“系统日志文件”小节已经解释了如何配置这些文件。

设置日志级别

在故障排查过程中,若能够临时变更特定姐件的日志的级别的话,将非常有益。

可以通过Hadoop守护进程的网页(在守护进程的网页的/logLevel目录下)来改变任 何log4j日志名称的日志级别。一般来说,Hadoop中的日志名称会对应一个类名 称,该类执行日志操作。此外,也有例外情况,因此最好是从源代码中查找日志名称。

获取堆栈轨迹

Hadoop守护进程提供一个网页(网页界面的/stacks目录)对正在守护进程的JVM中 运行着的线程执行线程转储(thread-dump)。例如,可通过http://jobtracker- host:50030/stacks 获得 jobtracker 的线程转储。


度量

HDFS和MapReduce守护进程收集的事件和度量相关的信息,这些信息统称为 “度量”(metric)。例如,各个datanode会收集以下度量(还有更多):写入的字节 数、块的复本数和客户端发起的读操作请求数(包括本地的和远程的)。

度量从属于特定的上下文(context)。目前,Hadoop使用“dfs”、 “mapred”、 “rpc"和“jvm”四个上下文。Hadoop守护进程通常在多个上下文中收集度量。 例如,datanode会分别为“dfs”、 “rpc”和“jvm”上下文收集度量。

度量和计数器的差别在哪里?

主要区别是使用范围不同:度量由Hadoop守护进程收集,而计数器由MapReduce任务收集之后再生成针对整个作业进行汇 总。此外,用户群也不同,从广义上讲,度量为管理员服务,而计数器主要为 MapReduce用户服务。

二者的工作方式也不同,包括数据采集和聚集过程。计数器是MapReduce的特 性,MapReduce系统确保计数器值在tasktracker产生,再传回jobtracker最终 回到运行MapReduce作业的客户端中。计数器是通过RPC的心跳传播的,在整个过程中,tasktracker和 jobtracker都会执行汇总操作。

度量的收集机制和接收更新的组件独立。有多种输出度量的方式,包括本地文 件、Ganglia和JMX。守护进程收集度量,并在输出之前执行汇总操作。

上下文定义了发布单位。例如,可以选择只发布“dfS”上下文,而不发布“jvm”上下文。度量在conf/hadoop-metrics.properties文件中配置,默认情况下,所有上下文都被配置成不发布度量。下例显示一个默认的配置文件(已经移除了注释):

dfs.class=org.apache.hadoop.metrics.spi.NullContextmapred.class=org.apache.hadoop.metrics.spi.NullContextjvm.class=org.apache.hadoop.metrics.spi.NullContextrpc.class=org.apache.hadoop.metrics.spi.NullContext

该文件中的每一行分别配置一个不同的上下文,并且指定一个类来管理该上下文中 的度量。这种类必须实现了 MetricsContext接口;并且,正如名称所描述的那 样,NullContext 类既不发布也不更新度量。

FileContext

FileContext将度量写到一个本地文件中。它含有两个配置属性,即fileName 和period。属性fileName指定待写入文件的绝对名称;属性period指定文件 更新间隔(以秒为单位)。这两个属性都是可选的,如果没有设置,则毎隔五秒钟将 度量写到标准输出。

待配置的属性名称的格式为:“上下文名称.属性名称”,中间用句点分隔。例 如,为了将“jvm”上下文转储到一个文件,我们将像下面这样更改其配置:

jvm.class=ong.apache.hadoop.metnics.file.FileContextjvm.fileName=/tmp/jvm_metnics.log

GangliaContext

Ganglia(htrp://gang/ia.info/)一个针对超大规模集群的开源的分布式监控系统,运 行之后仅消耗各个节点上很少的资源。Ganglia通过GangliaContext收集度量, 例如CPU和内存的使用情况。用户也可以将Hadoop度量添加到Ganglia。 GangliaContext需要指定一个属性(即servers)来描述一系列03叩如服务器, 格式是由空格和(或)逗号分隔的主机-端口对。

图10-2显示了从Ganglia获取的一类信息,即jobtracker队列中住务数量的变化情况。

NullContextWithUpdateThread

FileContext和GangliaContext都将度量输出到一个外部系统。但某些监控系 统(特别是JMX)则需要从Hadoop系统中“拉”度量’例如NullContextWithUpdateThread类。该类不向外部系统发布任何度量,但会借助 定时器定期刷新存储在内存中的度量值,确保这些度量在供其他系统使用时都是最 新的。

图10-2.在jobtracker队列中的任务数(由Ganglia获得)

除了 NullContext之外,所有实现了 MetricsContext接口的类都有自动更新功 能(这些类都使用period属性,默认值是5秒)。因此,只有在用户无需向外部系 统输出度量时,才会用到NullContextWithUpdateThread类。例如,假设用户 正在使用GangliaContext,由于这个类已经确保度量是最新的,因此用户能够使 用JMX,而无需进一步配置度量系统。后面将详细讨论JMX。

CompositeContext

CompositeContext类允许用户向多个上下文输出同一组度量。假设要将度量同时 输出到FileContext和 GangliaContext,则配置文件如下所示。

jvm.class=org.apache.hadoop.metrics.spi.CompositeContext	jvm.arity=2jvm.subl.class=org.apache.hadoop.metrics.file.FileContextjvm.fileName=/tmp/jvm_metrics.logjvm.sub2.class=org.apache.hadoop.metrics.ganglia.GangliaContextjvm.servers=ip-10-250-59-159.ec2.internal:8649

属性arity用于指定子上下文的数量。在本例中有两个子上下文。在各个子上下 文中,属性名称都附带一个序号做后缀,例如jvm.sub1.class和jvm.sub2.class。


Java 管理扩展(JMX)

Java管理扩展(JavaManagementExtensions,JMX)是一个标准的Java API,可监控 和管理应用。Hadoop包括多个托管bean(MBean),可以将Hadoop度量发布给支持 JMX的应用。现有MBean能够发布在“dfs”和rpc”上下文中的度量,但无法 发布“mapred”(在本书写就之际)和“jvm”上下文的度量(因为JVM自带的JVM 度量更为丰富)。这些Mbean如表10-3所示。

MBean类 守护进程 度量
NameNodeActivityMBean Namenode namenode的活动度址,例如新 建文件操作的执行次数
FSNamesystemMBean Namenode namenode的状态度量,例如已 连接的datanode数量
DataNodeActivityMBean Datanode datanode的活动度量,例如已读 字节数
FSDatasetMBean Datanode datanode的存储度进,例如总存 储容登、空闲存储容量
RpcActivityMBean 所有使用RPC的守护 进程,包括namenode, datanode、 jobtracker 和 tasktracker RPC统计信息,例如平均处理时 间等

JDK自带一个名为JConsole的工具来浏览JVM中MBean,这个工具可以浏览Hadoop的度量,如图10-3所示。

图10-3.运行在namenode节点上的JConsole的视图,显示了文件系统状态的度量

许多第三方的监控和报警系统(例如Nagios和Hyperic)均可查询MBean,因此通过 这些系统使用JMX监控一个Hadoop集群就很平常,前提是启用远程访问JMX功能和合理设置集群的安全级别,包括密码认证、SSL连接和SSL客户端认证等。 参见Java官方文档$深入了解如何配置这些选项。

可通过设置Java的系统属性来启用远程访问JMX的所有选项,就像前面提到的编 辑conf/hadoop-env.sh文件来设置Hadoop那样。下面的配置设置演示了如何在 namen0de(已经关闭 SSL协议)启用密码认证的远程访问JMX。这个过程与其他 Hadoop守护进程非常相似:

export HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.ssl-false-Dcom.sun.management.jmxremote.password.file=$HADOOP_CONF_DIR/ jmxremote.password-Dcom.sun.management.jmxremote.port=8004 $HADOOP_NAMENODE_OPTS"

文件jmxremote.password以纯文本格式列举出用户名和密码。JMX文档对这个文件 的格式有详细描述。

比较普遍的方案是,同时使用Ganglia和Nagios这样的警告系统来监控Hadoop系 统。Ganglia擅长髙效地收集大量度量,并以图形化界面呈现,Nagios和类似系统 擅长在某项度量的关键阀值被突破之后及时报警。

关注微信获取最新动态