HBase命令行接口的使用方法
HBase shell
- 进入退出
hbase shell #在任意节点都可以进入hbase shell
exit
- 查看帮助信息
help
通用命令
- 查询服务器状态,例如服务器的数量
status
- 查询hbase版本
version
- 如果有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'
获得表的描述/结构(describe)
语法:describe
list #列出所有的表
describe 'member' #查看表的描述 desc 'member'简写
删除一个列族,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'
查询数据,get
获取一个RowKey的所有数据(一行数据)
get < table> , < RK>
get 'member','guojing'
获取一个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
#删除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
点击进入后即可看到相应的region信息,编码值表名后面的一长串
点击相应的表进入复制相应的encodeRegionName
进入hbase的web页面(端口号默认为16010),找到相应的ServerName
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'
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'