最近研究了一下与Hadoop结合很好的监控工具Ganglia,在做hadoop平台的时候这个工具对于系统的监控有非常好的帮助。 最近部署了30台机器的环境,使用状况还是不错的。 参考了网络文章进行安装,其中发生了很多问题,逐一解决后,形成了这篇文章,这篇文章可以知道安装ganglia,如果安装碰到问题可以留言,共同探讨。
Hadoop版本:2.7.3
ganglia主要由三部分组成,gmond,gmetad,web。 gmond可以理解成数据采集工具。主要的工作方式是:采集当前机器的数据,送到目标的gmond上(这个gmond很重要),目标gmond将数据放到内存,等待gmetad过来拉数据。 gmetad可以理解成数据收集工具。主要的工作方式是:去目标gmond拉数据,然后执行本地存储(rrds)。
过程大致理解为:
gmond(很多个)———upd发送————> 目标gmond <—–tcp拉数据——–gmetad—存储–>rrds
web主要就是将gmetad收集的数据进行展示的工具。
注意:我目前演示的配置是单播,单播方便理解,可以更好的了解ganglia的工作机制。
1:epel 源
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm 这个源可能已经安装到了你的系统中,但是可能目标地址有些改变,建议删除。 删除命令
>rpm -e --nodeps epel-release-6-8.noarch验证是否删除
>rpm -qa|grep epel然后在执行安装
2:remi源
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm 如果已经安装,按照上面的步骤删除,重新安装。
验证加入的源工作正常 清楚本地的yum缓存
>yum clean all验证所有的yum源
>yum list在安装的时候可能出现如下错误: Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again /etc/yum.repos.d/epel.repo 如果机器没有证书会导致yum失败,这个时候需要修改https为http。如果没有报上面的错误,忽略就OK了。 修改内容,共有三个(这是其中一个): mirrorlist=http://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
然后执行
>yum clean all >yum list注:这两个yum源所有的机器都需要安装,无论是gmond还是gmetad。
所有的操作都是root 共3台机器 192.168.248.130(gmetad,web,gmond-master) 192.168.248.131(gmond) 192.168.248.132(gmond)
(192.168.248.130)
1:安装php支持
>yum install php-common php-cli php-gb php2:安装依赖库
>yum install rrdtool rrdtool-devel httpd apr-devel zlib-devel libconfuse-devel expat-devel pcre-devel3:安装ganglia
>yum install ganglia-web ganglia-gmetad ganglia-gmond ganglia-gmond-python安装完成后ganglia的相关文件所在的目录为一下三个路径:
/etc/ganglia/ (conf) /usr/share/ganglia (web) /var/lib/ganglia (rrds,dwoo)4:配置gmetad 修改/etc/ganglia/gmetad.conf 修改data_source,改成:
data_source "MyCluster” 192.168.248.130:8650 #gmetad采集数据的目标gmond地址和端口(tcp_accept_channel)5:配置gmond /etc/ganglia/gmond.conf,修改以下内容(这个gmond节点作为收集节点,这个节点可以是多个,最后需要在gmetad.conf上进行配置):
cluster { name = "MyCluster" #设置集群的名称 #owner = "unspecified" latlong = "unspecified" url = "unspecified" } #发送到目标gmond的地址和端口(单播) udp_send_channel { host=192.168.248.130 port = 8649 ttl = 1 } #接收udp的端口 udp_recv_channel { port = 8649 } #gmetad如果过来收集数据请求的端口 tcp_accept_channel { port = 8650 gzip_output = no }6:配置web 做这步之前最好进行备份
>cp -R /usr/share/ganglia /usr/share/ganglia_bak >ln -s /usr/share/ganglia /var/www/ganglia以下这个建议是其他作者建议的,我没有碰到情况,没有进行测试。 若有问题,可以将/usr/share/ganglia的内容直接复制到/var/www/ganglia
修改/etc/httpd/conf.d/ganglia.conf,改成:
# # Ganglia monitoring system php web frontend # Alias /ganglia /usr/share/ganglia <Location /ganglia> Order deny,allow Allow from all Allow from 127.0.0.1 Allow from ::1 # Allow from .example.com </Location>7:关闭SELINUX 如果已经关闭,忽略以下操作
>vi /etc/selinux/config把SELINUX=enforcing改成SELINUX=disable;
需要重启机器。
8:启动服务 目前服务器的配置已经完成,接下来需要启动服务了。 启动前需要关闭防火墙,否则数据送不上来
>service iptables stop >service gmetad start >service gmond start >service httpd restart192.168.248.131(gmond) 192.168.248.132(gmond) 添加yum源的操作和服务端一样
1:安装
>yum install ganglia-gmond >yum install ganglia-gmond-python2:配置gmond /etc/ganglia/gmond.conf,修改以下内容:
cluster { name = "MyCluster" #设置集群的名称 #owner = "unspecified" latlong = "unspecified" url = "unspecified" } #发送到收集服务器和端口 udp_send_channel { host=192.168.248.130 port = 8649 ttl = 1 } #接收端口,可以整个注释掉 udp_recv_channel { port = 8649 } #这个端口也可以注释掉 tcp_accept_channel { port = 8649 gzip_output = no }There was an error collecting ganglia data (127.0.0.1:8652): fsockopen error: Permission denied
>vi /etc/selinux/config把SELINUX=enforcing改成SELINUX=disable; 需要重启机器。
开始的时候拉不到其他机器的数据,所以我检测了一下upd端口,发现我们网络设置有问题。监控upd端口用tcpdump
>tcpdump -nn -vv -X udp port 8649http://192.168.248.130/ganglia
修改hadoop-2.7.3/etc/hadoop/hadoop-metrics2.properties这个文件。 主要是配置各种metrics的收集地址 因为这里只有一个ganglia集群,因此配置了一个收集节点,如果是多个集群需要单独配置。
*.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 # Tag values to use for the ganglia prefix. If not defined no tags are used. # If '*' all tags are used. If specifiying multiple tags separate them with # commas. Note that the last segment of the property name is the context name. # #*.sink.ganglia.tagsForPrefix.jvm=ProcesName #*.sink.ganglia.tagsForPrefix.dfs= #*.sink.ganglia.tagsForPrefix.rpc= #*.sink.ganglia.tagsForPrefix.mapred= namenode.sink.ganglia.servers=192.168.248.130:8649 datanode.sink.ganglia.servers=192.168.248.130:8649 resourcemanager.sink.ganglia.servers=192.168.248.130:8649 nodemanager.sink.ganglia.servers=192.168.248.130:8649 mrappmaster.sink.ganglia.servers=192.168.248.130:8649 jobhistoryserver.sink.ganglia.servers=192.168.248.130:8649http://blog.csdn.net/knowledgeaaa/article/details/23352797 https://my.oschina.net/HIJAY/blog/497933 http://blog.csdn.net/kafeiflynn/article/details/6634380 http://blog.csdn.net/xxd851116/article/details/21369163 http://jingyan.baidu.com/article/29697b913c4a2cab20de3cd9.html http://blog.chinaunix.net/uid-11121450-id-3147002.html http://blog.csdn.net/cywosp/article/details/39701141 http://blog.csdn.net/xugen12/article/details/48230617 http://ramosli.iteye.com/blog/1485992