Loading... <p> <span style="font-size:14px"> </span><span style="font-size:14px">Hadoop日常运行过程中一些参数需要进行实时监控,如:Map、Reduce任务数量,HDFS磁盘使用情况,namenode、datanode在线数量及健康情况,以便更好的掌握整个Hadoop集群架构的运行情况。</span> </p> <p> <span style="font-size:14px"> 下面结合最近工作中的一些实践经验,分享一下如何用zabbix实时监控Hadoop集群。</span> </p> <p> <span style="font-size:14px"> 工作一开始想在网上找现成的zabbix监控Hadoop文档,发现只一篇老外的文档:</span><span style="font-size:14px">https://code.google.com/p/mikoomi/wiki/05,51cto有人做了翻译,上面提供的好用的现成模板和两个强大的数据抓取脚本。</span> </p> <p> <span style="font-size:14px"> 但是在使用的过程中有很多问题,需要根据自己的实际环境进行修改,但脚本中大部分的数据抓取和分析代码是没有问题的,写这个的人的确很NB,下了不少工夫。</span> </p> <p> <span style="font-size:14px"> 我在这里仅提一下,需要改变的部分。</span> </p> <p> <span style="font-size:14px"> </span><span style="font-size:14px"> mikoomi文档中使用的是zabbix的</span><strong><span style="font-size:14px">externalscripts功能,生成数据后使用zabbix_sender命令向服务器发送数据,实现过程非常简单,但不走运的是,我使他这个方法,数据的抓取和整理都没有问题,就是在用zabbix_sender上传数据时问上失败。中间挣扎、纠结了好久,没有找到解决办法。遂决定,放弃原有的套路,换另一种方法。</span></strong> </p> <p> <strong><br /> </strong> </p> <p> <strong><span style="font-size:14px"> 如果你用mikoomi的原始方法实现在,那么恭喜你,他的方法确实简单好用,请你一定联系我你是怎么做到的。</span></strong> </p> <p> <strong><span style="font-size:14px"><br /> </span></strong> </p> <p> <strong><span style="font-size:14px"> <strong>下面来讲一下我的基于mikoomi脚本的另一种实现方法。</strong></span></strong> </p> <p> <strong><span style="font-size:14px"><br /> </span></strong> </p> <p> <strong><span style="font-size:14px"> 一开始,按照mikoomi原文中方法,导入他所提供的hadoop监控模板,一个用于监控namemode,一个用于监控jobstracker。</span></strong> </p> <p> <strong><span style="font-size:14px"> 然后,将需要被监控的namenode加入这两个模板,当加入第二个模板的时候会提示你,这两个模板中有两个item冲突了,很好办,从任意一个模板中删除冲突项就好了。</span></strong> </p> <p> <strong><span style="font-size:14px"> </span></strong> </p> <p> <strong><span style="font-size:14px"> 上述两步操作比较简单,就不多说了,下面重点来了,前方高能。</span></strong> </p> <p> <strong><span style="font-size:14px"> </span></strong> </p> <p> <strong><span style="font-size:14px"> 两个模板中默认原作者是要以zabbix_sender的方式传送监控数据的,所以两个模板中的item都是<span style="color:#E53333">zabbix_trap</span>的数据类型,现在我们即将采用的是传统的在被监控端创建UserParameter的方式,所以一个很重要的地方需要做修改,如图:</span></strong> </p> <p> <strong><span style="font-size:14px"><img src="//cto.wang/usr/uploads/2016/07/20160703155716-48.jpg" alt="" /></span></strong> </p> <p> <strong><span style="font-size:14px">(<span style="color:#E53333">这个页面就是这么宽,没办法,将就着看吧!</span><img src="//cto.wang/usr/uploads/2016/07/20160703155716-99.gif" border="0" alt="" />)</span></strong> </p> <p> <strong><span style="font-size:14px"> 两个模板60多个item一个一个改势必很痛苦,zabbix给我们提供了一个叫“mess update”的功能,全选之后(除了一个叫Data Collector的item),选择mess update即可进入如下页面进行修改:</span></strong> </p> <p> <strong><span style="font-size:14px"><img src="//cto.wang/usr/uploads/2016/07/20160703155716-91.png" alt="" /><br /> </span></strong> </p> <p> <span style="font-size:14px">就是这么贴心,就是这么简单。有些情况下,全选的话,可能无法成功,那就一次少选 几个,多改几次就是了。</span> </p> <p> <span style="font-size:14px"><br /> </span> </p> <p> <span style="font-size:14px"> 模板中item的数据类型改完之后,将进入最重要的数据抓取阶段。原作提供的脚本功能强大,但有很多地方不是哪里都能用,比如他的shell脚本是以#!/usr/bin/bash开头的。脚本抓取数据的来源是hadoop自身提供的web页面,脚本通过curl命令抓取页面内容进行分析,提炼后按照 “主机名 key value” 的格式进行存储。</span> </p> <p> <span style="font-size:14px"> 如果你们hadoop服务器的web页面是不需要密码访问的还好,如果像我们公司一样是需要密码访问的,这个url就需要特别注意一个,免得不能访问,就将无法获取数据。</span> </p> <p> <span style="font-size:14px"> </span> </p> <p> <span style="font-size:14px"> 现把我修改后的,正在使用的脚本放在这里,供参考 :</span> </p> <p> <span style="font-size:14px"></span> </p> <p class="p1"> <span style="font-size:14px">mikoomi-hadoop-jobtracker-plugin-helper.sh</span> </p> <p class="p1"> <span style="font-size:14px">mikoomi-hadoop-jobtracker-plugin.sh</span> </p> <p class="p1"> <span style="font-size:14px">mikoomi-hadoop-namenode-plugin-helper.sh</span> </p> <p class="p1"> <span style="font-size:14px">mikoomi-hadoop-namenode-plugin.sh</span> </p> <p class="p1"> <span style="font-size:14px">run_hd.sh</span> </p> <p></p> <p> </p> <p> <span style="font-size:14px">******************************************************</span> </p> <h3> <span style="font-size:16px;color:#E53333">注意事项</span>:<br /> </h3> <p> <span style="font-size:14px"> 上述脚本均是放在被监控端即namenode上运行。</span> </p> <p> <span style="font-size:14px"> 上述脚本中的URL使用了user.name变量,是因为我们的环境中访问hadoop页面是需要密码的,直接把密码加入url就行。如果不需要密码,把这个就是去掉就了行,注意,每一个脚本有两处URL。</span> </p> <p> <span style="font-size:14px"> 从脚本名称中便可看出,带有“<span style="color:#E53333"><strong>jobtracker</strong></span>”的脚本是用于抓取和jobtracker运行有关的数据的,带有“<span style="color:#E53333"><strong>namenode</strong></span>”的是用来抓取和namenode运行有关的数据的。</span> </p> <p> <span style="font-size:14px"> 脚本run_hd.sh是用来将前面脚本生成的数据合并到一处的,后并后的文件我取名为/tmp/namenode.txt(这个文件不要放在zabbix用户无法访问的目录,比如:root家目录下<img src="//cto.wang/usr/uploads/2016/07/20160703155716-58.gif" border="0" alt="" />)。</span> </p> <p> <span style="font-size:14px"> </span> </p> <p> <span style="font-size:14px"> 首次使用需先运行run_hd.sh产生数据文件/tmp/namenode.txt</span><span style="font-size:14px"> ,然后执行如下awk命令,将生成结果导入 </span><span style="line-height:1.5;font-size:14px">/etc/zabbix/zabbix_agentd.d/hadoop.conf 中,代码如下:</span> </p> <p> <span style="line-height:1.5"></span> </p> <p class="p1"> <span style="font-size:14px"> </span> </p> <pre class="prettyprint lang-bsh">awk '{ print "UserParameter="$2",grep \" "$2" \" /tmp/namenode.txt | awk '\''{ print '\$'3 }'\''" }' /tmp/namenode.txt > /etc/zabbix/zabbix_agentd.d/hadoop.conf</pre> <p><span style="font-size:14px"></span><span></span></p> <p> <span style="font-size:14px"> </span><span style="font-size:14px"> </span><span style="font-size:14px">注意: 此awk命令只需执行一次即可。</span> </p> <p> <span style="font-size:14px"><br /> </span> </p> <p> <span style="line-height:1.5"><span style="font-size:14px"> </span><span style="font-size:14px"> </span><span style="font-size:14px">然后重启被监控端的zabbix_agent进程: </span></span> </p> <p> <span style="line-height:1.5"><span style="font-size:14px"> </span></span> </p> <pre class="prettyprint lang-bsh"> service zabbix_agent restart</pre> <p><span style="font-size:14px"></span><span></span></p> <p> <span style="line-height:1.5"><br /> </span> </p> <p> <span style="line-height:1.5"> <span style="font-size:16px;color:#E53333"><strong>最后,也是最重要的,要把脚本run_hd.sh放入crontab,第分钟执行一次,这样/tmp/namenode.txt</strong></span><span style="font-size:16px;color:#E53333"><strong> 中的数据就会每分更新一次,和zabbix监控中的更新同步。</strong></span></span> </p> <p> <span style="line-height:1.5"><br /> </span> </p> <p> <span style="font-size:14px">好了,坐等出图。出图需要一点点时间,这个时候可以使用zabbix_get命令来测试,看一看zabbix server 端能不能接收到数据,比如: </span> </p> <p> <span style="font-size:14px"> </span> </p> <pre class="prettyprint lang-js"> zabbix_get -s namenode -k min_free_storage_pct_node_name</pre> <p><span style="font-size:14px"><br /> </span><span></span></p> <p> </p> <p> <img src="//cto.wang/usr/uploads/2016/07/20160703155716-77.png" alt="" /> </p> <p> </p> <p> <img src="//cto.wang/usr/uploads/2016/07/20160703155716-15.png" alt="" /> </p> <p> <span style="line-height:1.5"><br /> </span> </p> <p> <span style="line-height:1.5;font-size:14px">就先展示这两个吧,其它的数据不方便放上来。</span> </p> <p> <span style="line-height:1.5;font-size:14px">至于triger和报警,mikoomi的模板中都为我们安排好了,我们只要保障数据能正常上传,就可以了。</span> </p> <p> <span style="line-height:1.5;font-size:14px"><br /> </span> </p> <p> <span style="line-height:1.5;font-size:14px"><br /> </span> </p> <p> <span style="line-height:1.5;font-size:14px">如有疑问,欢迎留言~~~~<img src="//cto.wang/usr/uploads/2016/07/20160703155716-59.gif" border="0" alt="" /></span> </p> <p> <span style="line-height:1.5;font-size:14px"><br /> </span> </p> <p> <span style="line-height:1.5;font-size:14px">************************************************************</span> </p> <p> <span style="line-height:1.5;font-size:14px">神马, 谷歌不能访问?mikoomi的网页打不开?好吧,附送hosts一枚,不谢!</span> </p> <h2> <span style="color:#E53333">戳我就能上谷歌!</span><br /> </h2> <p> <span style="line-height:1.5;font-size:14px"><br /> </span> </p> <p> <span style="line-height:1.5;font-size:14px"><br /> </span> </p> <p> <span style="line-height:1.5;font-size:14px"><br /> </span> </p> <p> <span style="line-height:1.5;font-size:14px"><br /> </span></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信