1 Ganglia简介
Ganglia 是 UC Berkeley 发起的一个开源监视项目,设计用于测量数以千计的节点。每台计算机都运行一个收集和发送度量数据(如处理器速度、内存使用量等)的名为 gmond 的守护进程。它将从操作系统和指定主机中收集。接收所有度量数据的主机可以显示这些数据并且可以将这些数据的精简表单传递到层次结构中。正因为有这种层次结构模式,才使得 Ganglia 可以实现良好的扩展。gmond 带来的系统负载非常少,这使得它成为在集群中各台计算机上运行的一段代码,而不会影响用户性能
1.1 Ganglia组件
Ganglia 监控套件包括三个主要部分:gmond,gmetad,和网页接口,通常被称为ganglia-web。
Gmond :是一个守护进程,他运行在每一个需要监测的节点上,收集监测统计,发送和接受在同一个组播或单播通道上的统计信息 如果他是一个发送者(mute=no)他会收集基本指标,比如系统负载(load_one),CPU利用率。他同时也会发送用户通过添加C/Python模块来自定义的指标。 如果他是一个接收者(deaf=no)他会聚合所有从别的主机上发来的指标,并把它们都保存在内存缓冲区中。
Gmetad:也是一个守护进程,他定期检查gmonds,从那里拉取数据,并将他们的指标存储在RRD存储引擎中。他可以查询多个集群并聚合指标。他也被用于生成用户界面的web前端。
Ganglia-web :顾名思义,他应该安装在有gmetad运行的机器上,以便读取RRD文件。 集群是主机和度量数据的逻辑分组,比如数据库服务器,网页服务器,生产,测试,QA等,他们都是完全分开的,你需要为每个集群运行单独的gmond实例。
一般来说每个集群需要一个接收的gmond,每个网站需要一个gmetad。
图1 ganglia工作流
Ganglia工作流如图1所示:
左边是运行在各个节点上的gmond进程,这个进程的配置只由节点上/etc/gmond.conf的文件决定。所以,在各个监视节点上都需要安装和配置该文件。
右上角是更加负责的中心机(通常是这个集群中的一台,也可以不是)。在这个台机器上运行这着gmetad进程,收集来自各个节点上的信息并存储在RRDtool上,该进程的配置只由/etc/gmetad.conf决定。
右下角显示了关于网页方面的一些信息。我们的浏览网站时调用php脚本,从RRDTool数据库中抓取信息,动态的生成各类图表。
1.2 Ganglia运行模式(单播与多播)
Ganglia的收集数据工作可以工作在单播(unicast)或多播(multicast)模式下,默认为多播模式。
单播:发送自己收集到的监控数据到特定的一台或几台机器上,可以跨网段。
多播:发送自己收集到的监控数据到同一网段内所有的机器上,同时收集同一网段内的所有机器发送过来的监控数据。因为是以广播包的形式发送,因此需要同一网段内。但同一网段内,又可以定义不同的发送通道。
2 环境
平台:ubuntu12.04
Hadoop: hadoop-1.0.4
Hbase: hbase-0.94.5
拓扑:
图2 hadoop及hbase拓扑
软件安装:apt-get
3 安装部署(单播)
3.1 部署方式
监测节点(gmond):10.82.58.209、10.82.58.211、10.82.58.213(212主机离开了)。
主节点(gmetad、ganglia-web):10.82.58.211
3.2 安装
这里必须说明一个问题,我是在ubuntu下直接安装的。因为涉及到版本问题,hadoop-1.0.4和hbase-0.94.5均支持ganglia3.0和ganglia3.1版本,但是在配置时加载的模块是不一样的。所以,我们需要知道安装的ganglia是什么版本。
#sudo apt-cache show ganglia-webfrontend ganglia-monitor |
图3 安装版本信息
我们可以发现,安装的版本是ganglia3.1.7,所以是支持的。所以在211这台主机上安装ganglia-webfrontend和ganglia-monitor。在其他监视节点上,只需要安装ganglia-monitor即可。
#sudo apt-get install ganglia-webfrontend ganglia-monitor |
将ganglia的文件链接到apache的默认目录下
#sudo ln -s /usr/share/ganglia-webfront /var/www/ganglia |
Ganglia-webfrontend等同与上面所说的gmetad及ganglia-web,同时还会自动帮你安装apache2和rrdtool,非常方便。
3.3 Ganglia配置
在各个节点上,都需要配置/etc/gmond.conf,配置相同如下所示:
globals { daemonize = yes #以后台的方式运行 setuid = yes user = ganglia #运行gmond的用户 debug_level = 0 #调试级别 max_udp_msg_len = 1472 mute = no #哑巴,本节点将不会再广播任何自己收集到的数据在网络上 deaf = no #聋子,本节点不会再接收任何其他节点广播的数据包 host_dmax = 0 /*secs */ cleanup_threshold = 300 /*secs */ gexec = no #是否使用gexec send_metadata_interval = 10 #节点发送间隔/*secs*/ } /* If a cluster attribute is specified, then all gmond hosts are wrapped inside * of a tag. If you do not specify a cluster tag, then all will * NOT be wrapped inside of a tag. */ cluster { name = "hadoop" #本节点属于哪个cluster owner = "unspecified" #谁是该节点的所有者 latlong = "unspecified" #在地球上的坐标 url = "unspecified" } /* The host section describes attributes of the host, like the location */ host { location = "unspecified" } /* Feel free to specify as many udp_send_channels as you like. Gmond used to only support having a single channel */ udp_send_channel { #udp包的发送通道 host = 10.82.58.211 #多播,工作在239.2.11.71通道下。单播,则指向主节点,单播模式下也可以配置多个udp_send_channel port = 8649 #监听端口 ttl = 1 } /* You can specify as many udp_recv_channels as you like as well. */ udp_recv_channel { #接受UDP包配置 # mcast_join = 239.2.11.71 port = 8649 # bind = 239.2.11.71 } |
请注意send_metadata_interval被设置为10秒。Ganglia的度量指标从他的元数据间隔发送得到的。元数据包含诸如度量分组,类型等等。假如你重启了接收的gmond主机,那么元数据就会丢失,gmond就不知道如何处理度量数据,因此会把他们抛弃。这会导致生成空白的图表。在组播模式下,gmonds可以和其他任意一台主机通信,在元数据丢失情况请求重新获取。但这在单播模式下是不可能的,因此你需要命令gmond定期的发送元数据。
在主节点上(10.82.58.211)上还需要配置/etc/gmetad.conf,这里面的名字“hadoop”和上面gmond.conf中应该是一致的。
data_source "hadoop" 10.82.58.211:8649 |
3.4 Hadoop配置
所有hadoop所在的节点,均需要配置hadoop-metrics2.properties,配置如下:
# syntax: [prefix].[source|sink|jmx].[instance].[options] # See package.html for org.apache.hadoop.metrics2 for details *.sink.file.class=org.apache.hadoop.metrics2.sink.FileSink #namenode.sink.file.filename=namenode-metrics.out #datanode.sink.file.filename=datanode-metrics.out #jobtracker.sink.file.filename=jobtracker-metrics.out #tasktracker.sink.file.filename=tasktracker-metrics.out #maptask.sink.file.filename=maptask-metrics.out #reducetask.sink.file.filename=reducetask-metrics.out # Below are for sending metrics to Ganglia # # for Ganglia 3.0 support # *.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink30 # # for Ganglia 3.1 support *.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31 *.sink.ganglia.period=10 # default for supportsparse is false *.sink.ganglia.supportsparse=true *.sink.ganglia.slope=jvm.metrics.gcCount=zero,jvm.metrics.memHeapUsedM=both *.sink.ganglia.dmax=jvm.metrics.threadsBlocked=70,jvm.metrics.memHeapUsedM=40 namenode.sink.ganglia.servers=10.82.58.211:8649 datanode.sink.ganglia.servers=10.82.58.211:8649 jobtracker.sink.ganglia.servers=10.82.58.211:8649 tasktracker.sink.ganglia.servers=10.82.58.211:8649 maptask.sink.ganglia.servers=10.82.58.211:8649 reducetask.sink.ganglia.servers=10.82.58.211:8649 |
3.5 Hbase配置
# HBase-specific configuration to reset long-running stats (e.g. compactions) # If this variable is left out, then the default is no expiration. hbase.extendedperiod = 3600 # Configuration of the "hbase" context for ganglia # Pick one: Ganglia 3.0 (former) or Ganglia 3.1 (latter) # hbase.class=org.apache.hadoop.metrics.ganglia.GangliaContext hbase.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 hbase.period=10 hbase.servers=10.82.58.211:8649 # Configuration of the "jvm" context for null jvm.class=org.apache.hadoop.metrics.spi.NullContextWithUpdateThread jvm.period=10 # Configuration of the "jvm" context for file # jvm.class=org.apache.hadoop.hbase.metrics.file.TimeStampingFileContext # jvm.fileName=/tmp/metrics_jvm.log # Configuration of the "jvm" context for ganglia # Pick one: Ganglia 3.0 (former) or Ganglia 3.1 (latter) # jvm.class=org.apache.hadoop.metrics.ganglia.GangliaContext jvm.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 jvm.period=10 jvm.servers=10.82.58.211:8649 # Configuration of the "rpc" context for null rpc.class=org.apache.hadoop.metrics.spi.NullContextWithUpdateThread rpc.period=10 # Configuration of the "rpc" context for file # rpc.class=org.apache.hadoop.hbase.metrics.file.TimeStampingFileContext # rpc.fileName=/tmp/metrics_rpc.log # Configuration of the "rpc" context for ganglia # Pick one: Ganglia 3.0 (former) or Ganglia 3.1 (latter) # rpc.class=org.apache.hadoop.metrics.ganglia.GangliaContext rpc.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 rpc.period=10 rpc.servers=10.82.58.211:8649 # Configuration of the "rest" context for ganglia # Pick one: Ganglia 3.0 (former) or Ganglia 3.1 (latter) # rest.class=org.apache.hadoop.metrics.ganglia.GangliaContext rest.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 rest.period=10 rest.servers=10.82.58.211:8649 |
4 启动与检验
先需要重启hadoop和hbase 。在各个节点上启动gmond服务,主节点还需要启动gmetad服务。
#sudo service ganglia-monitor start #sudo service gmetad start |
可以通过10.82.58.211/ganglia来查看。
图4 web查看集群信息
5 参考资料
1、http://ganglia.sourceforge.net/
2、http://linuxjcq.blog.51cto.com/3042600/759008
3、http://cryinstall.com/?p=180
4、https://wiki.freebsdchina.org/howto/g/gangliainit
5、http://abloz.com/2012/09/19/ganglia-monitoring-hadoop.html
6、http://www.ibm.com/developerworks/wikis/display/wikiptype/ganglia
http://www.uml.org.cn/sjjm/201305171.asp