管理工具
HBase Shell
HBase Shell是HBase组件提供的基于JRuby IRB的字符界面的交互式客户端程序,通过HBase Shell可以实现对HBase的绝大部分操作
通过help ["group-name"]命令,可以获取该组包含命令的详细使用说明
hbck工具
hbck工具对HBase中的数据进行扫描,找出错误的数据块,并生产简单的报表。该工具调用方法如下:
$ bin/hbase hbck
输出结果摘录如下:
......
Number of Tables: 1
Number of live region servers: 2
Number of dead region servers: 0
Master: node1,60000,1357616232695
Number of backup masters: 0
......
Summary:
ROOT is okay.
Number of regions: 1
Deployed on: node1,60020,1357613909450
.META. is okay.
Number of regions: 1
Deployed on: node2,60020,1357613870843
t1 is okay.
Number of regions: 1
Deployed on: node1,60020,1357613870843
0 inconsistencies detected.
Status: OK
说明:关于hbck工具的详细信息,可参考HBase文档:http://hbase.apache.org/book/hbck.in.depth.html
hfile工具
hfile工具主要用于分析HBase的数据文件HFile。该工具的使用方法如下:
$ bin/hbase hfile [-a] [-b] [-e] [-f <arg>] [-k] [-m] [-p] [-r <arg>] [-s] [-v]
hfile工具具体的参数如表5-2所示。
表5-2 hfile参数
参数 |
说明 |
a,-checkfamily |
启用列族检查 |
b,-printblocks |
打印块索引元数据 |
e,-printkey |
打印所有rowkey |
f,-file <full/path/to/hfile> |
设置要分析的HFile,应输入完整的路径名,如hdfs://namenode:8020/hbase/.META./12/34 |
k,-checkrow |
查找没有排序的行 |
m,-printmeta |
打印hfile的元数据信息 |
p,-printkv |
打印所有的<Key/Value>键值对 |
r,-region <region-name> |
设置要分析的Region,输入Region名,如".META.,,1" |
s,-stats |
打印统计信息 |
v,-verbose |
打印详细信息,包括元数据和文件分割符 |
hlog工具
hlog工具主要用于分析HBase的WAL日志HLog文件。该工具的使用方法如下:
$ bin/hbase hlog <filename...> [-h] [-j] [-p] [-r <arg>] [-s <arg>] [-w <arg>]
hlog工具具体的参数如表5-3所示。
表5-3 hlog参数
参数 |
说明 |
h,-help |
打印帮助信息 |
-j, --json |
设置分析结果以json格式输出 |
p,-printvals |
打印所有值 |
r,-region <region-name> |
设置要分析的Region |
s,-sequence <sequence-num> |
设置要分析的序列 |
w,-row <row-name> |
设置要分析的行 |
zkcli工具
zkcli工具是hbase包装的ZooKeeper Shell,通过它可以查看HBase集群使用的ZooKeeper集群的信息。该工具的启用方法如下:
$ bin/hbase zkcli
启用后,会进入如下界面:
Welcome to ZooKeeper!
...
JLine support is enabled
...
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: node5:2181(CONNECTED) 0]
在该提示符下输入任意一个字符,可获取zkcli支持的命令列表
5.2.3 日常维护
Compaction操作
HBase每隔一段时间会对将许多小的HBase数据文件(HFile)合并成大文件,这个过程叫做Compaction。Compaction操作可有效较少HFile的个数,节约磁盘空间,提高HBase的性能。RegionServer在执行Compaction操作期间会占用大量的内存资源,过于频繁的Compaction操作会影响HBase的性能,而Compaction操作周期过长也会导致期间积累的HFile过多,单次Compaction时间很长,同样也会影响性能。如果HBase在运行期间一直保持较高的Compaction频率,应该考虑添加新的节点以提高集群的负载能力。
说明:关于HBase Compaction的详细信息,请参考HBase文档:http://hbase.apache.org/book/regions.arch.html#compaction
Split操作
HBase的Region大小是由上限的,当Region的大小超过了这个限制,RegionServer就会执行一次Split过程,将这个Region一份为二,这个过程叫做Split。Split过程使用标记方式,将实际的数据分割操作放在后台进行,因此,该操作速度较快。Split操作可以将Region分成两份,分配给不同的RegionServer管理。如果HBase中的数据存在局部过热的Region,可以考虑手动对这些Region执行split操作,并将这些Region重新分配给不同节点。下面是这个过程的HBase Shell示例:
hbase(main):010:0> split ‘test‘,‘test,row150,1357626052663.15bbf20f9ce9b38e0a6dcb0732a90945‘
hbase(main):012:0> move ‘9de82062a65b07cc70b999793ad658dd‘, ‘apache-node3,60020,1357613909450‘
数据备份
HBase的数据都记录在HDFS的/hbase目录下,可以将HBase数据作为普通的HDFS文件进行备份,相关内容可参见3.2.3日常维护章节内容。也可以使用HBase提供的Replication机制进行数据备份。Replication机制基于操作日志将HBase数据同步到备用集群。关于Replication的内容,请参见HBase文档:http://hbase.apache.org/replication.html。
数据迁移
HBase数据迁移问题主要包括三个方面,如下所示:
- 从外部数据源(如关系型数据库)导入数据
- 将HBase数据导入外部数据源
- HBase集群间的数据迁移
对于第一、二种情况,可以利用HBase API编写相关的导入程序完成数据导入/导出操作,对于第三种情况,当然也使用可以和一、二两种情况相同的方法,不过针对第三种情况,有更简单的方法。
- 导出数据
HBase提供导出数据的工具用来将HBase表格数据导出本地磁盘或HDFS上,该工具为:org.apache.hadoop.hbase.mapreduce.Export,使用方法如下:
$ bin/hbase org.apache.hadoop.hbase.mapreduce.Export [-D <property=value>]* <tablename> <outputdir> [<versions> [<starttime> [<endtime>]] [^[regex pattern] or [Prefix] to filter]]
设置参数可以限制导出的数据范围。下面的例子将表t1的f1列族导出到HDFS上:
$ bin/hbase –D hbase.mapreduce.scan.column.family=f1 t1 hdfs://node1:8020/tmp/t2_backup
- 导入数据
对应的,HBase也提供了导入工具,可将导出的数据导入到HBase中,该工具为org.apache.hadoop.hbase.mapreduce.Import,使用发方法如下:
$ bin/hbase org.apache.hadoop.hbase.mapreduce.Import <tablename> <inputdir>
*Import工具将数据导入HBase中已存在的表中,如果表不存在,将会发生错误。
- 导入TSV格式的数据
TSV (Tab Separated Values)格式的数据以Tab分隔每个列的数据。HBase提供了ImportTsv工具来导入这种数据:
$ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c <tablename> <inputdir>
下面给出一个示例,设HDFS上有一个TSV格式的数据文件/tmp/tsv如下所示:
row1c1c2
row2c1c2
row3c1c2
设第一列数据为rowkey,第二列对应HBase中的列为"f1:c1",第三列对应HBase中的列为"f1:c2",使用ImportTsv工具导入数据:
$ bin/base org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=HBASE_ROW_KEY,f1:c1,f1:c2 tsv hdfs://node1:8020/tmp/tsv
ImportTsv工具也需要导入前HBase中已存在目标表格。
说明:Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转换的数据迁移工具。HDHv1.0不包含Sqoop组件,但是兼容Apache Sqoop 1.4.2及以上版本。关于Sqoop的信息,请参见Sqoop官方网站:http://sqoop.apache.org/。
数据压缩
对于存在I/O瓶颈的应用中,启用压缩是一个不错的选择。数据压缩不但节约了磁盘空间,也加快了数据传输效率。HBase支持全局设置压缩算法,也支持按列族压缩数据。全局压缩算法通过" hbase.regionserver.codecs"来设置。HBase支持的压缩算法如表5-5所示。下面的示例为列族"f1"设置GZip压缩算法。
hbase(main):010:0> distable ‘t1‘
0 row(s) in 1.0700 seconds
hbase(main):005:0> alter ‘t1‘, {NAME => ‘f1‘, COMPRESSION =>‘GZ‘}
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.2980 seconds
hbase(main):006:0> enable ‘t1‘
0 row(s) in 2.0700 seconds
表5-5 HBase支持的压缩算法及性能比较
压缩算法 |
配置名 |
压缩率 |
编码效率 |
解码效率 |
LZO算法 |
LZO |
20.5% |
135 MB/s |
410 MB/s |
GZIP算法 |
GZ |
13.4% |
21 MB/s |
118 MB/s |
SNAPPY |
SNAPPY |
22.2% |
172 MB/s |
409 MB/s |
添加节点
为HBase添加新的RegionServer非常简单,只需在新的节点启动新的RegionServer即可。具体步骤如下:
- 在新的节点部署和配置HBase
- 在新节点运行下述命令启动新的RegionServer
$ bin/hbase-daemon.sh start regionserver
- 更新集群配置,将新节点加入regionservers文件中
- 刷新Web UI,检查新节点是否已经加入集群
删除节点
从HBase上动态删除RegionServer节点也比较方便,具体步骤如下:
- 在待删除的节点运行下述命令关闭RegionServer,该命令将告知Master重新分配该RegionServer上的Region到其他RegionServer上:
$ bin/hbase-daemon.sh stop regionserver
- 更新集群配置,将待删除节点从regionservers文件中删除
- 刷新Web UI,检查该节点是否已经退出集群