1、基本命令
1.1 查询状态(status)
hbase(main):009:0> status
1.2 查看版本(version)
hbase(main):001:0> version
1.3 查看帮助信息(help)
hbase(main):038:0> help
hbase(main):038:0> get help
hbase(main):038:0> put help
2、一般操作
2.1 创建命名空间(create_namespace)
hbase(main):001:0> create_namespace ‘test’
2.2 查看命名空间(list_namespace)
hbase(main):002:0> list_namespace
2.3 查看有哪些表(list)
hbase(main):003:0> list
2.4 查看表结构信息(describe)
hbase(main):004:0> describe 'test:user_info'
2.5 创建表(create)
语法:create <table>, {NAME => <family>, VERSIONS => <VERSIONS>}
- 创建表user_info,有两个family name:F1,F2,且版本数均为5
hbase(main):004:0> create 'test:user_info',{NAME => 'F1', VERSIONS => 5},{NAME => 'F2', VERSIONS => 5}
2) 不指定表的命名空间,在创建的表的所属命名空间为 default
hbase(main):004:0> create ‘user_info',{NAME => 'F1', VERSIONS => 5},{NAME => 'F2', VERSIONS => 5}
3)创建表user_order,并指定5个分区信息
hbase(main):021:0> create 'test:user_order',{NAME => 'F1', VERSIONS => 5},{NAME => 'F2', VERSIONS => 5},SPLITS=>['20','40','60','80']
2.6 删除表(drop)
删除表前先disable,然后drop。
hbase(main) :004:0> disable 'test:user_info'
hbase(main) :004:0> drop 'test:user_info'
2.7 修改表结构(alter)
修改表结构前先disable,然后alter。
语法:alter <table>, {NAME => <family>}, {NAME => <family>, METHOD => 'delete'}
- 修改表user_info的F1的最大版本数为6.
hbase(main):009:0* disable 'test:user_info'
hbase(main):010:0> alter 'test:user_info',{NAME=>'F1',VERSIONS=>6}
hbase(main):011:0> enable 'test:user_info'
2.8添加数据(put)
语法:put <table>,<rowkey>,<family:column>,<value>,<timestamp>
- 给表user_info添加数据
hbase(main):014:0> put 'test:user_info','001001001','F1:real_name','我是HBase'
hbase(main):014:0> put 'test:user_info','001001001', 'F1:phone','18822666698'
2.9查询数据(get)
语法:get <table>,<rowkey>,[<family:column>,....]
- 查询rowkey=001001001一行下的所有的列值
hbase(main):019:0> get 'test:user_info','001001001'
2. 查询rowkey=001001001一行下指定列的值
hbase(main):020:0> get 'test:user_info','001001001', 'F1:real_name','F1:phone'
2.10 扫描数据(scan)
语法:scan <table>, {COLUMNS => [ <family:column>,.... ], LIMIT => num},另外,还可以添加STARTROW、STOP_ROW、TIMERANGE和FITLER等高级功能
- 扫描表user_info的前5条数据
hbase(main):001:0> scan 'test:user_info',{LIMIT=>5}
2.扫描表user_info的COLUMNS=F1的前10条数据
hbase(main):041:0> scan 'test:user_info',{COLUMNS=>'F1',LIMIT=>5}
3.扫描表user_info的开始行='00000000001',结束行=00000000010'的数据
hbase(main):050:0> scan 'test:user_info',{STARTROW=>'00000000001',ENDROW=>'00000000010'}
4.扫描表user_info的版本号大于5的所有数据
hbase(main):001:0> scan 'test:user_info',{VERSIONS=>5}
5.扫描表user_info的时间戳在指定范围内的数据
hbase(main):003:0> scan 'test:user_info',{TIMERANGE=>[1564122031569,1564132831125],VERSIONS=>2}
2.11查看表的总行数
语法:count <table>, {INTERVAL => intervalNum, CACHE => cacheNum},INTERVAL设置多少行显示一次及对应的rowkey,默认1000;CACHE每次去取的缓存区大小,默认是10,调整该参数可提高查询速度
- 查看表user_info中的总行数,每2000条显示一次,缓存区为1000
hbase(main):005:0> count 'test:user_info', {INTERVAL => 2000, CACHE => 1000}
Current count: 2000, row: 00200000011
Current count: 4000, row: 00400000028
Current count: 6000, row: 00600000134
Current count: 8000, row: 00800000213
9967 row(s) in 0.1800 seconds
2.12删除列数据(delete)
语法:delete <table>, <rowkey>, <family:column> , <timestamp>,必须指定列名
- 删除表user_info中rowkey=’00200000011’,column=’F1:address’的数据
hbase(main):006:0> delete 'test:user_info','00200000011','F1:address'
2.13删除行数据(deleteall)
语法:deleteall <table>, <rowkey>, <family:column> , <timestamp>,可以不指定列名,删除整行数据。
- 删除表user_info中rowkey=’00200000011’的数据
hbase(main):007:0> deleteall 'test:user_info','00200000011'
2.14 删除表的所有数据(truncate)
语法:truncate <table>,具体过程是:disable table -> drop table -> create table
- 删除表user_info的所有数据
hbase(main):008:0> truncate ‘test:user_info’
2.15快照(snapshot)
1) 查看所有快照 list_snapshots
2)查看表的所有快照 list_table_snapshots
3) 创建快照 snapshot 'test:user_info', 'snapshot.user_info.20190726'
4)删除快照 delete_snapshot 'snapshot.user_info.20190726'
2.16查看表是否存在(exists)
hbase(main):021:0> exists 'test:user_info'
2.17 查看表是否可用
hbase(main):022:0> is_enabled 'test:user_info'
2.18 禁用表(disable),启用表(enable)
3、过滤器
查看服务端生效的所有过滤器
hbase(main):027:0> show_filters
3.1 DependentColumnFilter
是一种允许用户指定一个参考列或引用列来过滤其他列的过滤器,过滤的原则是基于参考列的时间戳来进行筛选。
hbase(main):001:0> scan 'test:user_info',{ FILTER => "DependentColumnFilter('F1','phone')"}
3.2 KeyOnlyFilter
这个过滤器唯一的功能就是只返回每行的行键,值全部为空,这对于只关注于行键的应用场景来说非常合适,这样忽略掉其值就可以减少传递到客户端的数据量,能起到一定的优化作用。
hbase(main):002:0> scan 'test:user_info',{ FILTER => "KeyOnlyFilter()"}
3.3 ColumnCountGetFilter
这个过滤器来返回每行最多返回多少列,并在遇到一行的列数超过我们所设置的限制值的时候,结束扫描操作。
hbase(main):002:0> scan 'test:user_info',{ FILTER => "ColumnCountGetFilter(10)"}
3.4 SingleColumnValueFilter
用一列的值决定这一行的数据是否被过滤
hbase(main):019:0>
scan 'test:user_info',{ FILTER => "SingleColumnValueFilter('F1','phone',>=,'18812346969')"}
3.5 PrefixFilter
Rowkey筛选出具有特定前缀的行键的数据。这个过滤器所实现的功能其实也可以由RowFilter结合RegexComparator来实现,不过这里提供了一种简便的使用方法。
hbase(main):020:0> scan 'test:user_info',{ FILTER => "PrefixFilter('001000088')"}
3.6 SingleColumnValueExcludeFilter
用一列的值决定筛选条件的列的不会包含在返回的结果中
hbase(main):021:0>
scan 'test:user_info',{ FILTER => " SingleColumnValueExcludeFilter ('F1','phone',=,'18812346969')"}
3.7 FirstKeyOnlyFilter
如果只想返回的结果集中只包含第一列Rowkey的数据,那么这个过滤器能够满足你的要求。它在找到每行的Rowkey之后会停止扫描,从而使扫描的性能也得到了一定的提升
hbase(main):001:0> scan 'test:user_info',{ FILTER => "FirstKeyOnlyFilter()"}
3.8 ColumnRangeFilter
该过滤器只扫描指定列名大小范围内的列,可以进行高效的列名内部扫描。
hbase(main):001:0> scan 'test:user_info',{ FILTER => "ColumnRangeFilter('address',true,'phone',true)"}
3.9 TimestampsFilter
单元值时间版本过滤器,根据数据的时间戳版本进行过滤,其参数是一个集合列表。
hbase(main):003:0> scan 'test:user_info',{ FILTER => "TimestampsFilter(1,2)"}
3.10 FamilyFilter
列族过滤器,通常在Scan过程中通过设定某些列族来实现该功能,而不是直接使用该过滤器,该过滤器使用频率不高。
hbase(main):004:0> scan 'test:user_info',{ FILTER => "FamilyFilter(=,'F1')"}
3.11 QualifierFilter
列名过滤器,对列名进行筛选,类似于行键过滤器,只是针对列名过滤而已。
hbase(main):007:0> scan 'test:user_info',{ FILTER => "QualifierFilter(=,'phone')"}
3.12 ColumnPrefixFilter
用于列名(Qualifier)前缀过滤,即包含某个前缀的所有列名。
hbase(main):010:0> scan 'test:user_info',{ FILTER => "ColumnPrefixFilter(=,'phon')"}
3.13 RowFilter
行键过滤器:对行键进行过滤,执行Scan使用startRow/stopRow方式比较好,而RowFilter过滤器也可以完成对某一行的过过滤
hbase(main):017:0> scan 'test:user_info',{ FILTER => "RowFilter(=,'00100008800')"}
3.14 MultipleColumnPrefixFilter
MultipleColumnPrefixFilter与ColumnPrefixFilter 的行为类似,但可以指定多个列名(Qualifier)前缀。
hbase(main):001:0> scan 'test:user_info',{ FILTER => "MultipleColumnPrefixFilter('add','pho')"}
3.15 InclusiveStopFilter
包含结束行键的过滤器,常规的Scan包含startRow 但不包含stopRow,如果使用该过滤器便可以包含stopRow。
hbase(main):002:0> scan 'test:user_info',{ FILTER => "InclusiveStopFilter('0010088888999')"}
3.16 PageFilter
行键分页过滤器:基于行的分页。
hbase(main):004:0> scan 'test:user_info',{ FILTER => "PageFilter(10)"}
3.17 ValueFilter
单元值过滤器:对单元值进行过滤
hbase(main):006:0> scan 'test:user_info',{ FILTER => "ValueFilter('abcd')"}
3.18 ColumnPaginationFilter
列分页过滤器:基于列进行分页,需要设置偏移量与返回数量。
hbase(main):009:0> scan 'test:user_info',{ FILTER => "ColumnPaginationFilter(10,1)"}
4、附加说明
4.1建表语句详解
create 'test:user_info',{NAME => 'F1', BLOOMFILTER => ''ROW ', REPLICATION_SCOPE => '0', VERSIONS => '5', COMPRESSION => 'LZO', TTL => 'FOREVER', IN_MEMORY => 'false', BLOCKCACHE => 'false'},
{NAME => 'F2', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => '5', COMPRESSION => 'LZO', TTL => ' FOREVER ', IN_MEMORY => 'true'}
其中的属性有:
- REPLICATION_SCOPE:复制份数;
- NAME:包含一个列簇“F1”
- VERSIONS:设置历史版本数,默认为1
4)BLOOMFILTER: 布隆过滤器,优化HBase的随即读取性能,可选值NONE|ROW|ROWCOL,默认为NONE,该参数可以单独对某个列簇启用。启用过滤器,对于get操作以及部分scan操作可以剔除掉不会用到的存储文件,减少实际IO次数,提高随机读性能。Row类型适用于只根据Row进行查找,而RowCol类型适用于根据Row+Col联合查找,如下:
Row类型适用于:get ‘test:user_info’,’row1′
RowCol类型适用于:get ‘test:user_info’,’row1′,{COLUMN => ‘F1’}
对于有随机读的业务,建议开启Row类型的过滤器,使用空间换时间,提高随机读性能。
5)COMPRESSION:数据压缩方式,HBase支持多种形式的数据压缩,一方面减少数据存储空间,一方面降低数据网络传输量进而提升读取效率。目前HBase支持的压缩算法主要包括三种:GZip | LZO | Snappy,下面表格分别从压缩率,编解码速率三个方面对其进行对比:
(1) GZIP的压缩率最高,但是其实CPU密集型的,对CPU的消耗比其他算法要多,压缩和解压速度也慢;
(2) LZO的压缩率居中,比GZIP要低一些,但是压缩和解压速度明显要比GZIP快很多,其中解压速度快的更多;
(3) Zippy/Snappy的压缩率最低,而压缩和解压速度要稍微比LZO要快一些。
Snappy的压缩率最低,但是编解码速率最高,对CPU的消耗也最小,目前一般建议使用Snappy。
6)IN_MEMORY:数据是否常驻内存,默认为false。HBase为频繁访问的数据提供了一个缓存区域,缓存区域一般存储数据量小、访问频繁的数据,常见场景为元数据存储。默认情况,该缓存区域大小等于Jvm Heapsize * 0.2 * 0.25 ,假如Jvm Heapsize = 70G,存储区域的大小约等于3.2G。需要注意的是HBase Meta元数据信息存储在这块区域,如果业务数据设置为true而且太大会导致Meta数据被置换出去,导致整个集群性能降低,所以在设置该参数时需要格外小心。
7)BLOCKCACHE:是否开启block cache缓存,默认开启。
8) TTL:数据过期时间,单位为秒,默认为永久保存。对于很多业务来说,有时候并不需要永久保存某些数据,永久保存会导致数据量越来越大,消耗存储空间是其一,另一方面还会导致查询效率降低。如果设置了过期时间,HBase在Compact时会通过一定机制检查数据是否过期,过期数据会被删除。用户可以根据具体业务场景设置为一个月或者三个月。示例中TTL => ‘ 259200’设置数据过期时间为三天,以最后一次更新时间为开始时间(TTL=>的更新超时时间是指:该列最后更新的时间,到超时时间的限制,而不是第一次创建,到超时时间。)