ganglia收集hbase的metrics
Ganglia 是 UC Berkeley 发起的一个开源监视项目,设计用于測量数以千计的节点。每台计算机都执行一个收集和发送度量数据(如处理器速度、内存使用量等)的名为 gmond 的守护进程。它将从操作系统和指定主机中收集。
接收全部度量数据的主机能够显示这些数据而且能够将这些数据的精简表单传递到层次结构中。正由于有这样的层次结构模式,才使得 Ganglia 能够实现良好的扩展。
gmond 带来的系统负载很少,这使得它成为在集群中各台计算机上执行的一段代码,而不会影响用户性能。
Ganglia监控软件主要是用来监控系统性能的软件,如:cpu 、mem、硬盘利用率, I/O负载、网络流量情况等,通过曲线非常easy见到每一个节点的工作状态。对合理调整、分配系统资源,提高系统总体性能起到重要作用。
hadoop和hbase非常好地支持了ganglia这个开源监控工具,说明ganglia是hadoop生态中不可或缺的一部分。
本文介绍假设用ganglia收集hbase的各种指标。重点解决两个大家比較关注的问题:
(1) hbase指标过多,怎样过滤?
(2) 改动hadoop-metrics.properties 后,是否能不用重新启动hadoop或hbase。
一、hbase metrics 配置
以 hbase-0.98为例,须要配置 hadoop-metrics2-hbase.properties
# syntax: [prefix].[source|sink].[instance].[options] # See javadoc of package-info.java for org.apache.hadoop.metrics2 for details #*.sink.file*.class=org.apache.hadoop.metrics2.sink.FileSink default sampling period *.period=10 # Below are some examples of sinks that could be used # to monitor different hbase daemons. # hbase.sink.file-all.class=org.apache.hadoop.metrics2.sink.FileSink # hbase.sink.file-all.filename=all.metrics # hbase.sink.file0.class=org.apache.hadoop.metrics2.sink.FileSink # hbase.sink.file0.context=hmaster # hbase.sink.file0.filename=master.metrics # hbase.sink.file1.class=org.apache.hadoop.metrics2.sink.FileSink # hbase.sink.file1.context=thrift-one # hbase.sink.file1.filename=thrift-one.metrics # hbase.sink.file2.class=org.apache.hadoop.metrics2.sink.FileSink # hbase.sink.file2.context=thrift-two # hbase.sink.file2.filename=thrift-one.metrics # hbase.sink.file3.class=org.apache.hadoop.metrics2.sink.FileSink # hbase.sink.file3.context=rest # hbase.sink.file3.filename=rest.metrics *.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31 *.sink.ganglia.period=10 hbase.sink.ganglia.period=10 hbase.sink.ganglia.servers=172.18.144.198:8648
ganglia 3.1及以上版本号须要用这个类:org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31
重新启动hbase和gmod 就能够在ganglia web界面上看到众多指标出来了。可是,指标太多了。 到region级别的了,每一个 region属于哪个 table。每一个table又一堆指标。从ganglia的rrd数据库中能够看到:
-rw-rw-rw- 1 hadoop root 12216 Jul 23 16:40 regionserver.Regions.Namespace_default_table_o_m_ocs_ordersplitamount_region_f15998ced89264146b3ec3888db625f6_metric_scanNext_max.rrd -rw-rw-rw- 1 hadoop root 12216 Jul 23 16:40 regionserver.Regions.Namespace_default_table_o_m_forest_maps_region_cb5490455403d92ff2e6acd17c2b3877_metric_get_95th_percentile.rrd -rw-rw-rw- 1 hadoop root 12216 Jul 23 16:40 regionserver.Regions.namespace_default_table_o_s_peking_orders_region_bc87e3d9b61ee8c14956914d407ad11c_metric_mutateCount.rrd -rw-rw-rw- 1 hadoop root 12216 Jul 23 16:40 regionserver.Regions.namespace_default_table_o_m_ocs_ordersplitamount_region_5ca4ba7d83369781b41c939d260fdcdd_metric_mutateCount.rrd -rw-rw-rw- 1 hadoop root 12216 Jul 23 16:40 regionserver.Regions.namespace_default_table_o_m_ocs_orderamount_region_3ecd8c8440eae5a1191ef9e6e523ea9f_metric_appendCount.rrd -rw-rw-rw- 1 hadoop root 12216 Jul 23 16:40 regionserver.Regions.Namespace_default_table_o_m_ocs_orderamount20140722_region_985afc00551d4fb68ceaf9188f5b9d12_metric_get_75th_percentile.rrd -rw-rw-rw- 1 hadoop root 12216 Jul 23 16:40 regionserver.Regions.namespace_default_table_o_m_ocs_orderamount20140722_region_9672e9b9ea759fc1aee838e4ae228fa9_metric_memStoreSize.rrd -rw-rw-rw- 1 hadoop root 12216 Jul 23 16:40 regionserver.Regions.Namespace_default_table_o_m_chat_analysis_session20140722_region_d709618a5b60e44a03befe57ca480ef9_metric_get_num_ops.rrd
http://hbase.apache.org/book/hbase_metrics.html 这个上面提到一个warning to ganglia user:
Warning to Ganglia Users: by default, HBase will emit a LOT of metrics per RegionServer which may swamp your installation. Options include either increasing Ganglia server capacity, or configuring HBase to emit fewer metrics.
hbase 默认会吐那么多指标出来。我们得想办法过滤。保留我们须要的指标即可。
以下说明怎样过滤
二、指标过滤
(1) master: 去除Assignment,Balancer, Filtersystem.MetaHlog 。以及各percentile、max、median、min。保留mean平均值
(2) regionserver:去除WAL相关,以及各percentile、max、median、min,保留mean平均值
(3) region:太多,表级别的,所有去除。
*.source.filter.class=org.apache.hadoop.metrics2.filter.RegexFilter #*.source.filter.class=org.apache.hadoop.metrics2.filter.GlobFilter *.record.filter.class=${*.source.filter.class} *.metric.filter.class=${*.source.filter.class} *.period=10 *.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31 *.sink.ganglia.period=10 hbase.sink.ganglia.metric.filter.exclude=^(.*table.*)|(\\w+metric)|(\\w+region\\w+)|(Balancer\\w+)|(\\w+Assign\\w+)|(\\w+percentile)|(\\w+max)|(\\w+median)|(\\w+min)|(MetaHlog\\w+)|(\\w+WAL\\w+)$ hbase.sink.ganglia.period=10 hbase.sink.ganglia.servers=<span style="font-family: Arial, Helvetica, sans-serif;">172.18.144.198</span><span style="font-family: Arial, Helvetica, sans-serif;">:8648</span>
改动之后,重新启动 hbase和gmod,在ganglia web console 上就能够看到指标少了,清爽了非常多,更有针对性了。
三、hadoop metrics system 管理
假设hbase已经在线服务了。暴力stop会影响服务。graceful_stop则会涉及到数据的暂时迁移。都不理想,最好是不重新启动。
首先我们要开启 JMX。
export HBASE_JMX_BASE="-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10101" export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10102" export HBASE_THRIFT_OPTS="$HBASE_THRIFT_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10103" export HBASE_ZOOKEEPER_OPTS="$HBASE_ZOOKEEPER_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10104" export HBASE_REST_OPTS="$HBASE_REST_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10105"
这一步没办法。要重新启动hbase。事实上一開始就能够仅仅开启JMX,重新启动一次。
后面的 metrics配置都能够单独来启动和停止的。
想想我们的hadoop集群是用ganglia和nagios结合使用的。ganglia收集数据。图表展现。nagios 收集数据,监控报警,这简直绝配。假设将jmx的功能集成到nagios中就更好了。
不好将metric system的启动和停止放在nagios中。仅仅能另起一炉灶,用JMXToolkit 和 shell脚本搞定。
JMXToolkit 比較简单,网上资料非常多。在使用过程中有一些要注意的地方。
git clone https://github.com/larsgeorge/jmxtoolkit.git cd jmxtoolkit vim build.xml # 改动hbase版本号为 0.98.1-hadoop2 ant
ant编译后生成 build/hbase-0.98.1-hadoop2-jmxtoolkit.jar ,这个jar是我们终于想要的。
再看配置文件。build/conf/hbase-0.98.1-hadoop2-jmx.properties
不知道jmxtoolkit内部实现是怎么样的,这里面的指标名称都不正确。也不全。并且我们仅仅是须要操作metrics system,将这个文件自己编辑了下:
[hbaseMetricsSystem] @object=Hadoop:service=HBase,name=MetricsSystem,sub=Control @url=service:jmx:rmi:///jndi/rmi://${HOSTNAME}:${PORT}/jmxrmi @user=${USER|controlRole} @password=${PASSWORD|password} *stop=VOID *start=VOID
重命名 build/hbase-0.98-metrics.properties
注意 object 就是上面jconsole截图中的metrics system的 objectName,而 *stop和*start则是 Mbean 提供的方法。
測试:
java -cp hbase-0.98.1-hadoop2-jmxtoolkit.jar org.apache.hadoop.hbase.jmxtoolkit.JMXToolkit -f hbase-0.98-metrics.properties -o hbaseMetricsSystem -q stop /etc/init.d/gmond restart
能够看到改动的指标生效了。
最后。写个简单的shell,扔到生产环境上去。
#!/bin/bash # manage the metrics system of hbase individually. # ./hbase-metrics-system.sh start # ./hbase-metrics-system.sh stop config_file_template=hbase-0.98-metrics.properties config_file_product=hbase-0.98-metrics-product.properties #for i in ${hbase_hostnames=[@]};do for i in `cat $HBASE_HOME/conf/regionservers`;do cp ${config_file_template} ${config_file_product} sed -i "s/\${HOSTNAME}/$i/g" ${config_file_product} sed -i "s/\${PORT}/10102/g" ${config_file_product} java -cp hbase-0.98.1-hadoop2-jmxtoolkit.jar org.apache.hadoop.hbase.jmxtoolkit.JMXToolkit -f ${config_file_product} -o hbaseMetricsSystem -q $1 echo "$1 metrics system of $i" /bin/rm ${config_file_product} done echo "done"
办法有点简陋,先攻克了再说。