hbase日常操作收集
基本命令
-
建表
create 'testtable','coulmn1','coulmn2'
也可以建表时加coulmn的属性如:
create 'testtable', {NAME => 'coulmn1', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '10', COMPRESSION => 'LZO', TTL => '30000', IN_MEMORY => 'false', BLOCKCACHE => 'false'}, {NAME => 'coulmn', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '30', COMPRESSION => 'LZO', TTL => '30000', IN_MEMORY => 'true'}
其中的属性有versions:设置历史版本数,TTL:过期时间,COMPRESSION:压缩方式,当配置lzo的情况
- 删除表
删除表之前先要禁用表
disable 'testtable' drop 'testtable'
- describe 'testtable'(查看表结构)
- alter修改表结构
- list列出所有表
- hbase中的disable和enable
disable和enable都是hbase中比较常见的操作,很多对table的修改都需要表在disable的状态下才能进行。
- disable
当通过disable ‘sunwg01′将表sunwg01的状态更改为disable的时候,hbase会在zookeeper中的table结点下做个记录,如下:
[zk: hadoop01:2181(CONNECTED) 32] get /hbase/table/sunwg01 3203@hadoop01DISABLED cZxid = 0×3017 ctime = Fri Jun 29 14:00:07 CST 2012 mZxid = 0×3022 mtime = Fri Jun 29 14:05:05 CST 2012 pZxid = 0×3017 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0×0 dataLength = 26 numChildren = 0
结点/hbase/table/sunwg01的值并不是3203@hadoop01DISABLED,而还有些不可能见的字符在里面。
在zookeeper记录下该表的同时,还会将表sunwg01的region全部下线,region为offline状态。
- enable
enable的过程和disable相反,会把表sunwg01的所有region上线,并删除zookeeper下的标志。但有个问题需要主要,如果在enable前,META中有region的server信息,那么此时会在该server上将该region online;如果没有server的信息,那么此时还要随机选择一台机器作为该region的server。
日常维护的命令
- major_compact 'testtable'
通常生产环境会关闭自动major_compact(配置文件中hbase.hregion.majorcompaction设为0),选择一个晚上用户少的时间窗口手工major_compact。
如果hbase更新不是太频繁,可以一个星期对所有表做一次major_compact,这个可以在做完一次major_compact后,观看所有的storefile数量,如果storefile数量增加到major_compact后的storefile的近二倍时,可以对所有表做一次major_compact,时间比较长,操作尽量避免高锋期。
- flush 'testtable'
将所有memstore刷新到hdfs,通常如果发现regionserver的内存使用过大,造成该机的regionserver很多线程block,可以执行一下flush操作,这个操作会造成hbase的storefile数量剧增,应尽量避免这个操作。
还有一种情况,在hbase进行迁移的时候,如果选择拷贝文件方式,可以先停写入,然后flush所有表,拷贝文件。
- balance_switch
balance_switch flase|true,配置master是否执行平衡各个regionserver的region数量,当我们需要维护或者重启一个regionserver时,会关闭balancer,这样就使得region在regionserver上的分布不均,这个时候需要手工的开启balance。
重启一个regionserver
bin/graceful_stop.sh --restart --reload --debug nodename
这个操作是平滑的重启regionserver进程,对服务不会有影响,他会先将需要重启的regionserver上面的所有region迁移到其它的服务器,然后重启,最后又会将之前的region迁移回来。
当我们修改一个配置时,可以用这种方式重启每一台机子,这个命令会关闭balancer,所以最后我们要在hbase shell里面执行一下balance_switch true。
对于hbase regionserver重启,不要直接kill进程,这样会造成在zookeeper.session.timeout这个时间长的中断,也不要通过bin/hbase-daemon.sh stop regionserver去重启,如果运气不太好,-ROOT-或者.META.表在上面的话,所有的请求会全部失败。
关闭下线一台regionserver
bin/graceful_stop.sh --stop nodename
和上面一样,系统会在关闭之前迁移所有region,然后stop进程,同样最后我们要手工balance_switch true,开启master的region均衡。
检查region是否正常以及修复
bin/hbase hbck #检查 bin/hbase hbck -fix #修复
会返回所有的region是否正常挂载,如没有正常挂载可以使用下一条命令修复,如果还是不能修复,那需要看日志为什么失败,手工处理。
hbase的迁移
- copytable方式
bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable --peer.adr=zookeeper1,zookeeper2,zookeeper3:/hbase 'testtable'
目前0.92之前的版本的不支持多版本的复制,0.94已经支持多个版本的复制。当然这个操作需要添加hbase目录里的conf/mapred-site.xml,可以复制hadoop的过来。
- Export/Import
bin/hbase org.apache.hadoop.hbase.mapreduce.Export testtable /user/testtable [versions] [starttime] [stoptime] bin/hbase org.apache.hadoop.hbase.mapreduce.Import testtable /user/testtable
跨版本的迁移,我觉得是一个不错的选择,而且copytable不支持多版本,而export支持多版本,比copytable更实用一些。
- 直接拷贝hdfs对应的文件
首先拷贝hdfs文件,如:
bin/hadoop distcp hdfs://srcnamenode:9000/hbase/testtable/ hdfs://distnamenode:9000/hbase/testtable/
然后在目的hbase上执行:
bin/hbase org.jruby.Main bin/add_table.rb /hbase/testtable
生成meta信息后,重启hbase
这个操作是简单的方式,操作之前可以关闭hbase的写入,执行flush所有表(上面有介绍),再distcp拷贝,如果hadoop版本不一致,可以用hftp接口的方式,我推荐使用这种方式,成本低。
错误处理
- 关于错误No server address listed in .META. for region
有的时候会遇到如下的错误:
hbase(main):001:0> scan ‘sunwg01′ ROW COLUMN+CELL ERROR: org.apache.hadoop.hbase.client.NoServerForRegionException: No server address listed in .META. for region sunwg01,,1340950453949.4464c1f0c6bdee802052d669af6db6ae.
原因是hbase在.META.中没有办法找到该region的server信息,也就是没有办法找到该region所在server地址。
这个时候比较简单的处理方式就是先disable table,然后enable table,在enable的时候会对region重新分配regionserver。
hbase(main):002:0> disable ‘sunwg01′ 0 row(s) in 2.1500 seconds hbase(main):003:0> enable ‘sunwg01′ 0 row(s) in 2.0700 seconds hbase(main):004:0> scan ‘sunwg01′ ROW COLUMN+CELL r1 column=f1:k1, timestamp=1340950459281, value=100 1 row(s) in 0.0570 seconds
其他信息
- RegionSever统计信息说明
通过浏览器访问RegionServer的60030端口可以查看该RegionSever的各方面的统计信息。
通过这些统计信息可以对RegionServer的各个方面有大概的了解,知道当前ReginoServer的运行情况,为RegionServer的优化和配置提供数据支持
如:http://slave003:60030/rs-status
Metrics中的各个状态信息:
名称 | 含义 |
---|---|
requestsPerSecond | 上次统计到现在的每秒的请求数,包括写和读 |
numberOfOnlineRegions | 在线的region的个数 |
numberOfStores | 总的store的个数,多个column family会对应多个store |
numberOfStorefiles | 总的storefile的个数 |
storefileIndexSizeMB | 总的storefile的索引大小 |
rootIndexSizeKB | 总的根索引的大小 |
totalStaticIndexSizeKB | 总的非压缩的data block索引大小,包括根索引,枝索引,叶索引 |
totalStaticBloomSizeKB | 总的非压缩Bloom索引大小 |
memstoreSizeMB | 总memstore的大小,memstore中存储尚未被flush到hdfs上的数据 |
readRequestsCount | 读请求数 |
writeRequestsCount | 写请求数 |
compactionQueueSize | compact队列长度 |
flushQueueSize | region flush队列长度 |
usedHeapMB | 已经使用的堆大小 |
maxHeapMB | 总的堆大小,总的堆大小一般是堆设置减去4mb,这4mb是保留区域大小,可以通过参数修改 |
blockCacheSizeMB | 已使用块缓冲的大小 |
blockCacheFreeMB | 空闲的块缓冲大小 |
blockCacheCount | 块缓冲数 |
blockCacheHitCount | 块缓冲命中数 |
blockCacheMissCount | 块缓冲未命中数 |
blockCacheEvictedCount | lru淘汰块数 |
blockCacheHitRatio | 总块缓冲命中率 |
blockCacheHitCachingRatio | 指定访问cache的缓冲命中率 |
hdfsBlocksLocalityIndex | hdfs块本地访问比率 |
-
hbase监控指标均可通过http形式的jmx方式采集:
# 采集master 上的hb.m.AverageLoad http://172.17.19.81:60010/jmx?qry=hadoop:service=Master,name=Master # 采集master 上的hb.m.AverageLoad以外的指标 http://172.17.19.81:60010/jmx?qry=hadoop:service=Master,name=MasterStatistics # 采集region server 上的指标(hbase.txt 文件中 hbase.regionserver.*) http://172.17.19.81:60030/jmx?qry=hadoop:service=RegionServer,name=RegionServerStatistics # 采集region server 上的动态统计指标(hbase.txt 文件中 hbase.RegionServerDynamicStatistics.*) http://172.17.19.81:60030/jmx?qry=hadoop:service=RegionServer,name=RegionServerDynamicStatistics