通过收集metrics并图形化展示是监控HBase集群的有效手段,能帮助用户了解集群状态,排查问题。HBase通过Hadoop metrics框架输出metrics,最常用的MetricsContext实现包括Ganglia和文件;HBase还能通过JMX输出metrics。
通过hadoop-metircs.properties配置项,可以输出metrics到Ganglia:
hbase.class=org.apache.hadoop.metrics.ganglia.GangliaContext31hbase.period=10
hbase.servers=GMETADHOST_IP:PORTjvm.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 jvm.period=10
jvm.servers=GMETADHOST_IP:PORTrpc.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 rpc.period=10
rpc.servers=GMETADHOST_IP:PORT
如上图,HBase输出的metrics分为三种:
数据库的性能一般用响应时间来衡量。最理想的测试方法是模拟真实的工作负载来测试HBase的响应时间。在这之前,往往需要通过某种基准性能测试来建立信心。
HBase自带了了性能评估工具,能够很方便地测试HBase的随机读写、顺序读写和扫描等性能。
$ $HBASE_HOME/bin/hbaseorg.apache.hadoop.hbase.PerformanceEvaluation
HBase的性能会受到整个依赖栈的影响,性能优化涉及到所有的依赖层,涵盖硬件选择、网络配置、操作系统设置、JVM设置和Hadoop HDFS优化等。
之前的部署章节,提到过一些相应的优化手段。本节关注HBase本身的配置参数调优。针对不同的应用场景,HBase的工作负载类型不同,需要不同的优化配置组合,以下是一些基本原则:
其他影响性能的因素还包括数据压缩(参见之前章节,可以具体指定到列族)、RowKey设计、Major Compactions(建议在集群负载低的时候收工进行)和RegionServer处理RPC请求线程数等。
下线节点的正确做法:虽然HBase能够自动适应RegionServer的下线,重新分配之上的Region,但探测转移过程中集群性能会受到影响,所以主动迁移数据,然后杀掉RegionServer的做法更安全一些。HBase提供了graceful-stop脚本:
$ bin/graceful_stop.sh
Usage: graceful_stop.sh [--config] [--restart] [--reload][--thrift] [--rest]
脚本按照以下顺序停止RegionServer:
增加节点的正确做法:首先得在HDFS上增加DataNode,然后启动RegionServer进程,最后可选地使用Balancer平衡Region。
针对小版本的不停服务滚动式升级:基本思路是首先下线节点,然后升级节点上组件,最后重新上线该节点(使用graceful_stop.sh脚本reload选项)。
HBase Shell还提供了一些常用管理命令:
HBase提供了hbck工具用来检查和修复数据一致性和完整性。在复杂的实际生产环境中,HBase还是可能会出现两种类型的数据不一致现象:
在集群处于高负载时,表的拆分动作会增大系统延迟。如果Rowkey的分布是可预估的,那么创建表的时候可以指定拆分策略:
hbase(main):019:0> create 'mytable' ,'family', {SPLITS_FILE => '~/splitkeylist'}
$ cat ~/splitkeylist
A
B
C
D
整个集群的复制除了数据备份外,还能支持以下场景:跨数据中心集群;分开集群分别处理在线实时和离线批处理任务。
HBase集群间复制通过HLog的同步实现。HLog发送给第二集群执行是异步的,不会阻塞第一集群的写入动作。
集群间复制有三种类型:
配置集群间复制步骤如下:首先在hbase-site.xml中启用集群复制。
hbase.replication
true
hbase(main):002:0> add_peer '1',
"secondary_cluster_zookeeper_quorum:2181:/hbase"
hbase(main):002:0> create 'mytable',{NAME => 'colfam1', REPLICATION_SCOPE => '1'}
$ $HBASE_HOME/bin/hbase
org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication
Usage: verifyrep [--starttime=X][--stoptime=Y] [--families=A]
这一系列打完收工。。。