HBase进阶与API
HBase进阶与API
一、Hbase shell
1、Region信息观察
创建表指定命名空间
在创建表的时候可以选择创建到bigdata17这个namespace中,如何实现呢?
使用这种格式即可:‘命名空间名称:表名’
针对default这个命名空间,在使用的时候可以省略不写
create 'bigdata29:t1','info'
此时使用list查看所有的表
如果只想查看bigdata17这个命名空间中的表,如何实现呢?
可以使用命令list_namespace_tables
list_namespace_tables 'n1'
查看region中的某列簇数据
hbase hfile -p -f /hbase/data/default/tbl_user/92994712513a45baaa12b72117dda5e5/info/d84e2013791845968917d876e2b438a5
# 行键的设计在hbase中有三大设计原则:唯一性 长度不宜过长 散列性
put 'students','1500100001','info:name','施笑槐'
put 'students','1500100001','info:age','22'
put 'students','1500100001','info:gender','女'
put 'students','1500100001','info:clazz','文科六班'
put 'students','1500100002','info:name','吕金鹏'
put 'students','1500100002','info:age','24'
put 'students','1500100002','info:gender','男'
put 'students','1500100002','info:clazz','文科六班'
put 'students','1500100003','info:name','单乐蕊'
put 'students','1500100003','info:age','22'
put 'students','1500100003','info:gender','女'
put 'students','1500100003','info:clazz','理科六班'
put 'students','1500100004','info:name','葛德曜'
put 'students','1500100004','info:age','24'
put 'students','1500100004','info:gender','男'
put 'students','1500100004','info:clazz','理科三班'
刷新数据:flush 'tb'
合并数据:major_compact 'tb'
1.1 查看表的所有region
list_regions '表名'
1.2 强制将表切分出来一个region
split '表名','行键'
但是在页面上可以看到三个:过一会会自动的把原来的删除
1.2 查看某一行在哪个region中
locate_region '表名','行键'
可以hbase hfile -p -f xxxx 查看一下
画图带同学理解
2、预分region解决热点问题(面试题)
面试题:如何解决hbase中遇到的热点问题?
row设计的一个关键点是查询维度
(在建表的时候根据具体的查询业务 设计rowkey 预拆分)
在默认的拆分策略中 ,region的大小达到一定的阈值以后才会进行拆分,并且拆分的region在同一个regionserver中 ,只有达到负载均衡的时机时才会进行region重分配!并且开始如果有大量的数据进行插入操作,那么并发就会集中在单个RS中, 形成热点问题,所以如果有并发插入的时候尽量避免热点问题 ,应当预划分 Region的rowkeyRange范围 ,在建表的时候就指定预region范围
查看命令使用(指定4个切割点,就会有5个region)
help 'create'
create 'tb_split','cf',SPLITS => ['e','h','l','r']
list_regions 'tb_split'
添加数据试试
put 'tb_split','c001','cf:name','first'
put 'tb_split','f001','cf:name','second'
put 'tb_split','z001','cf:name','last'
hbase hfile -p --f xxxx 查看数据
如果没有数据,因为数据还在内存中,需要手动刷新内存到HDFS中,以HFile的形式存储
3、总结(写一个文档总结回顾)
4、日志查看
演示不启动hdfs 就启动hbase
日志目录:
/usr/local/soft/hbase-1.7.1/logs
start-all.sh发现HMaster没启动,hbase shell客户端也可以正常访问
再启动hbase就好了
5、scan进阶使用
查看所有的命名空间
list_namespace
查看某个命名空间下的所有表
list_namespace_tables 'default'
修改命名空间,设置一个属性
alter_namespace 'bigdata25',{METHOD=>'set','author'=>'wyh'}
查看命名空间属性
describe_namespace 'bigdata17'
删除一个属性
alter_namespace 'bigdata17',{METHOD=>'unset', NAME=>'author'}
删除一个命名空间
drop_namespace 'bigdata17'
创建一张表
create 'teacher','cf'
添加数据
put 'teacher','tid0001','cf:tid',1
put 'teacher','tid0002','cf:tid',2
put 'teacher','tid0003','cf:tid',3
put 'teacher','tid0004','cf:tid',4
put 'teacher','tid0005','cf:tid',5
put 'teacher','tid0006','cf:tid',6
显示三行数据
scan 'teacher',{LIMIT=>3}
put 'teacher','tid00001','cf:name','wyh'
scan 'teacher',{LIMIT=>3}
从后查三行
scan 'teacher',{LIMIT=>3,REVERSED=>true}
查看包含指定列的行
scan 'teacher',{LIMIT=>3,COLUMNS=>['cf:name']}
简化写法:
scan 'teacher',LIMIT=>3,COLUMNS=>['cf:name']
在已有的值后面追加值
append 'teacher','tid00001','cf:name','123'
6、get进阶使用
简单使用,获取某一行数据
get 'teacher','tid0001'
获取某一行的某个列簇
get 'teacher','tid0001','cf'
获取某一行的某一列(属性 )
get 'teacher','tid0001','cf:name'
可以新增一个列簇数据测试
查看历史版本
1、修改表可以存储多个版本
alter 'teacher',NAME=>'cf',VERSIONS=>3
2、put四次相同rowkey和列的数据
put 'teacher','tid0001','cf:name','xiaohu1'
put 'teacher','tid0001','cf:name','xiaohu2'
put 'teacher','tid0001','cf:name','xiaohu3'
put 'teacher','tid0001','cf:name','xiaohu4'
3、查看历史数据,默认是最新的
get 'teacher','tid0001',COLUMN=>'cf:name',VERSIONS=>2
修改列簇的过期时间 TTL单位是秒,这个时间是与插入的时间比较,而不是现在开始60s
alter 'teacher',{NAME=>'cf2',TTL=>'60'}
7、插入时间指定时间戳
put 'students','sid0007','info:clazz','bigdata29',1693644893843
数据时间:数据产生那一刻的时间
事务时间(操作时间):接收到数据并处理的那一刻时间
8、delete(只能删除一个单元格,不能删除列簇)
删除某一列
delete 'teacher','tid0004','cf:tid'
9、deleteall(删除不了某个列簇,但是可以删除多个单元格)
删除一行,如果不指定列簇,删除的是一行中的所有列簇
deleteall 'teacher','tid0006'
删除单元格
deleteall 'teacher','tid0006','cf:name','cf2:job'
10、incr和counter
统计表有多少行(统计的是行键的个数)
count 'teacher'
新建一个自增的一列
incr 'teacher','tid0001','cf:cnt',1
每操作一次,自增1
incr 'teacher','tid0001','cf:cnt',1
incr 'teacher','tid0001','cf:cnt',10
incr 'teacher','tid0001','cf:cnt',100
配合counter取出数据,只能去incr字段
get_counter 'teacher','tid0001','cf:cnt'
11、获取region的分割点,清除数据,快照
获取region的分割点
get_splits 'tb_split'
清除表数据
truncate 'teacher'
拍摄快照
snapshot 'tb_split','tb_split_20240416'
列出所有快照
list_table_snapshots 'tb_split'
再添加一些数据
put 'tb_split','k001','cf:name','wyh'
恢复快照(先禁用)
disable 'tb_split'
restore_snapshot 'tb_split_20240416'
enable 'tb_split'
二、JAVA API
pom文件
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.2.7</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.6</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.6</version>
</dependency>