HBase命令行接口的使用方法

HBase shell

  1. 进入退出
hbase shell #在任意节点都可以进入hbase shell
exit
  1. 查看帮助信息
help

通用命令

  1. 查询服务器状态,例如服务器的数量
status
  1. 查询hbase版本
version
  1. 如果有kerberos认证,需要事先使用相应的keytab进行一下认证(使用kinit命令),认证成功之后再使用hbase shell进入可以使用whoami命令可查看当前用户
whoami

DDL(Data Definition Language 数据定义语言)

创建一个表(create)

语法:create

, {NAME=>,VERSIONS=>}

例如:创建表t1,有两个family name:f1,f2,且版本均为2

create 't1',{NAME=>'f1',VERSIONS=>2},{NAME=>'f2',VERSIONS=>2}

注意点:

  • 区分大小写,NAME不能写成name
  • 表名,列名需要以字符串的形式输入,即用单引号修饰,如’t1’

还有一种非标准创建的语法,创建表member,列族是member_id,address,info,版本为1(默认版本)。如下:

create 'member','member_id','address','info'

前端传递参数hbase用于分页 hbase restful接口_数据

获得表的描述/结构(describe)

语法:describe

list #列出所有的表
describe 'member' #查看表的描述 desc 'member'简写

前端传递参数hbase用于分页 hbase restful接口_ci_02

删除一个列族,alter,disable,enable

alter 'member',{NAME=>'member_id',METHOD=>'delete'}#只能删除disabled的表的列族,没有添加列族
#将表enable,启用表
enable 'member'
#将表disabled,禁用表
disable 'member'

删表, drop

create 'temp_table','member_id','address','info'#创建一个示例
is_enabled 'temp_table' #查看是否可用
is_disabled 'temp_table' #查看是否禁用
drop 'temp_table' #只有被禁用的表才能被删除

删除并重新创建一个表

truncate 't1'

查询表是否存在

exists 'member'

查看文件存储路径

打开hdfs的web页面 /hbase/data/default/member

default是默认的命名空间,member是表名

DML(数据操纵语言)

插入/更新数据,put

语法:put <table(表名)> ,<RK(RowKey)>,<CF : CQ(列键)>,<value(值)>

put 'member' ,'guojing','info:company','alibaba'
put 'member' ,'guojing','info:age','24'
put 'member' ,'guojing','address:contry','china'
put 'member' ,'guojing','address:province','zhejiang'
put 'member' ,'guojing','address:city','hangzhou'

注:现在表的数据都在内存中,并没有落地到磁盘。如果这时候想要落地到磁盘只能手动落地

先插入MemStore,到达阈值和时间后才会插入内存,可以不运行flush,查看hdfs文件中相应表的info文件,为空,说明未插入内存。
命令: flush< table >

flush 'member'

更新一条数据

#将guojing的年龄更新为18,原数据还在原位置
put 'member','guojing','info:age','18'

实现加入数据的递增

#给'xiaofeng'这个RowKey增加'info:age'字段,并使用counter实现递增
incr 'member','xiaofeng','info:age'
get 'member','xiaofeng','info:age'
incr 'member','xiaofeng','info:age'
get 'member','xiaofeng','info:age'
#获取当前counter的值
get_counter 'member','xiaofeng','info:age'

前端传递参数hbase用于分页 hbase restful接口_表名_03

查询数据,get

获取一个RowKey的所有数据(一行数据)
get < table> , < RK>

get 'member','guojing'

前端传递参数hbase用于分页 hbase restful接口_数据_04


获取一个RowKey中,一个列族的所有数据

get 'member','guojing','info'

获取一个RowKey中,一个列键(列族:列)的所有数据

get 'member','guojing','info:age'

获取不同版本的数据

#通过timestamp获取不同版本的数据
get 'member','guojing',{COLUMN=>'info:age',TIMESTAMP=>1627474097682}

查询表中有多少行

count 'member'

全表扫描(scan)

scan < table >

#注:全表扫描时一般和过滤器一起使用,不指定版本默认显示一个版本
#(1)扫描时指定列族
scan 'member',{COLUMN=>'info'}
#(2)扫描时指定列族,并限定显示最新的5个版本 要在创建表的时候设置版本,如果只有一个版本就没有历史数据了
scan 'member',{COLUMN=>'info',VERSIONS=>5}
#(3)设置开启Row模式,开启Row模式会把那些已经删除标记但未删除的数据也显示出来
scan 'member',{COLUMN=>'info',RAW => true}
#(4)列的过滤
# 查询member表中列族为info和address的信息
scan 'member',{COLUMNS=>{'info','address'}}
# 查询member表中列键为info:name和address:city
scan 'member',{COLUMNS=>{'info:name','address:city'}}
# 查询member表中列族为info和address且列名含有a字符的信息
scan 'member',{COLUMNS=>{'info','data'},FILTER=>"(QualifierFilter(=,'substring:a'))"}
# 查询member表中列族为info,rk范围是[rk0001,rk0003)的数据
scan 'member',{COLUMNS=>'info',STARTROW=>'00001',ENDROW=>'00003'}
# 查询member表中RowKey中以rk字符开头
scan 'member',{FILTER=>"PrefixFilter('0')"}
# 查询member表中指定时间范围的数据
scan 'member',{TIMERANGE=>{12341234,43214321}}

删除数据,delete

删除一次是删除标记,get能获得上一个版本的数据,如果只有一个版本,就不能获得,但是其实是添加删除标记并没有真正删除,用scan可以看见其为type为delete

前端传递参数hbase用于分页 hbase restful接口_数据_05

#删除id为guojing的值的'info:age'字段
delete 'member','guojing','info:age'
#删除整行
delete 'member','guojing'

清空整张表

truncate 'member'

Region操作

1)移动region

语法:move ‘encodeRegionName’,‘ServerName’

encodeRegionName指的是regionName后面的编码,ServerName指的是master-status的Region Servers列表

# 将表'member'移动到节点node2上
move '2d47b41ebf2c0be89e5b7d5f7e97bf3a','node2,16020,1628232102271'

寻找encodeRegionName的过程,进入hbase的web页面(端口号默认为16010),找到相应的ServerName

前端传递参数hbase用于分页 hbase restful接口_表名_06

点击进入后即可看到相应的region信息,编码值表名后面的一长串

前端传递参数hbase用于分页 hbase restful接口_ci_07

点击相应的表进入复制相应的encodeRegionName

前端传递参数hbase用于分页 hbase restful接口_ci_08

进入hbase的web页面(端口号默认为16010),找到相应的ServerName

前端传递参数hbase用于分页 hbase restful接口_前端传递参数hbase用于分页_09

2)开启关闭region

语法:balance_switch true|false

HBase是一种支持自动负载均衡的分布式KV数据库,在开启balance的开关(balance_switch)后,HBase的HMaster进程会自动根据指定策略挑选出一些Region,并将这些Region分配给负载比较低的RegionServer上。

(当有新的节点进入hbase,为了负载均衡一种方式是手动将一部分region移动到新的节点,另一种方案是开启自动均衡策略,当region数据增多后,分裂时进入新的节点)

balance_switch true

3)手动split

语法:split ‘regionName’,‘splitKey’

split '2d47b41ebf2c0be89e5b7d5f7e97bf3a','001'

前端传递参数hbase用于分页 hbase restful接口_ci_10

4)手动触发major compaction

HBase是基于一种LSM-Tree(Log-Structured Merge Tree)存储模型设计的,写入路径上是先写入WAL(Write-Ahead-Log)即预写日志,再写入memstore缓存,满足一定条件后执行flush操作将缓存数据刷写到磁盘,生成一个HFile数据文件。随着数据不断写入,磁盘HFile文件就会越来越多,文件太多会影响HBase查询性能,主要体现在查询数据的io次数增加。为了优化查询性能,HBase会合并小的HFile以减少文件数量,这种合并HFile的操作称为Compaction。

Minor Compaction:指选取一些小的、相邻的HFile将他们合并成一个更大的HFile。默认情况下,minor compaction会删除选取HFile中的TTL过期数据。

Major Compaction:指将一个Store中所有的HFile合并成一个HFile,这个过程会清理三类没有意义的数据:被删除的数据(打了Delete标记的数据)、TTL过期数据、版本号超过设定版本号的数据。

#Compact all regions in a table:压缩表中所有region
major_compact 't1'
#Compact an entire region:压缩一个region
major_compact 'r1'
#Compact a single column family within a region:压缩region中的一个列族
major_compact 'r1', 'c1'
#Compact a single column family within a table:压缩表中的一个列族
major_compact 't1', 'c1'
```cmd
#Compact all regions in a table:压缩表中所有region
major_compact 't1'
#Compact an entire region:压缩一个region
major_compact 'r1'
#Compact a single column family within a region:压缩region中的一个列族
major_compact 'r1', 'c1'
#Compact a single column family within a table:压缩表中的一个列族
major_compact 't1', 'c1'