saowei

Hbase常用shell命令

1、操作Hbase数据的方式

1、通过shell操作
2、Hive建立外部表操作
3、通过MapReduce操作
4、通过Phoenix操作
5、通过Java API(使用最多)

2、操作Hbase的shell命令

进入到hbase的命令栏
[root@master ~]# hbase shell

进入命令栏后才能操作hbase
注意:在hbase中,删除----Ctrl+Back
创建
create \'表名\',\'列簇名\'
举例:create \'test\',\'info\'

注意:
	这种建表默认创建在default命名空间上;
	没有具体的表结构,没有约束;
	命名空间类似于数据库

创建命名空间----create_namespace \'空间名\'
举例:cerate_namespace \'ns1\'

在指定的命名空间下创建表----create \'空间名:表名\',\'列簇名\'
举例:create \'ns1:ns1_tb1\',\'cf1\'
查看----listdesc
list:查看除了hbase命名空间以外的其他命名空间下的所有表

查看有哪些命名空间----list_namespace

查看指定的命名空间下的表----list_namespace_tables \'空间名\'
举例:list_namespace_tables \'ns1\'

查看表的结构(主要是列簇的一些描述)----desc \'表名\'
删除----dropdelete
启动表----enabled \'表名\'
禁用表----disable \'表名\'

删除表,删除之前要将表的状态调成禁用
举例:
	先禁用
	disable \'ns1:ns1_tb1\'
	再删除
	drop \'ns1:ns1_tb1\'
删除表中的数据:删除列
	delete \'表名\',\'rk\',\'列簇名:列名\'
注意:当列有多版本时,获取数据的时候,获取的是最新版本的(原来的数据还在,只是被覆盖掉了)
	删除数据的时候,会先将最老的版本删除掉
	
删除表中的数据:删除列簇=删除所有的列
	deleteall \'表名\', \'rk\'
	
删除表中的所有数据:清空表
	truncate \'表名\'
注意:truncate删除表所有数据的时候,表的预分区会被重置成一个分区
删除指定的列簇:
	alter \'表名\',\'delete\'=>\'列簇名\'
增加新的列簇:
	alter \'表名\',NAME=>\'列簇名\'
加载数据----put
向表中加载数据
	put \'表名\',\'rowkey\',\'列簇名:列名\',\'数据\'
	
举例:put \'test\',\'000\',\'info:name\',\'zhaosi\'
注意:当数据是中文的时候,在加载数据的时候,会以二进制的形式存储;在获取的时候,显示的是十六进制
获取数据----getscan
从表中获取数据有两种方式
方式1:使用get和指定的rk,获取一条数据
方式2:使用scan获取表的全部数据

方式1:get \'表名\',\'rowkey\'
举例: get \'test\',\'000\'
方式2:scan \'表名\',{LIMIT=>m}-----指定limit为m条,数据一般都是千万级别的,一定要指定limit
举例:scan \'test\',{LIMIT=>2}-----获取前两条

范围查询 STARTROW(开始rowkey) ENDROW(结束rowkey)  
scan \'表名\',{STARTROW=>\'row1\',ENDROW=>\'row2\'}----------左闭右开
scan \'表名\',{STARTROW=>\'row1\',ENDROW=>\'row2\',LIMIT=>m}
  • scan全盘扫描获取数据,根据rk按照字典排序一一例举出来

    插入数据
    put \'test\',\'0\',\'info:id\',0
    put \'test\',\'000\',\'info:name\',zhaosi
    put \'test\',\'001\',\'info:name\',zhangsan
    put \'test\',\'002\',\'info:name\',\'lisi\'
    put \'test\',\'003\',\'info:name\',\'wangwu\'
    put \'test\',\'1\',\'info:id\',1
    put \'test\',\'2\',\'info:id\',2
    put \'test\',\'3\',\'info:id\',3
    put \'test\',\'10\',\'info:id\',10
    
    获取数据
    scan \'test\'
    
    结果
    ROW                COLUMN+CELL                                                   
     0                 column=info:id, timestamp=1645891312403, value=0               
     000               column=info:age, timestamp=1645874985339, value=22             
     000               column=info:name, timestamp=1645864553447, value=zhaosi       
     001               column=info:name, timestamp=1645891607389, value=zhangsan     
     002               column=info:name, timestamp=1645891642306, value=lisi         
     003               column=info:name, timestamp=1645891655893, value=wangwu       
     1                 column=info:id, timestamp=1645891312893, value=1               
     10                column=info:id, timestamp=1645891316123, value=10             
     2                 column=info:id, timestamp=1645891312947, value=2               
     3                 column=info:id, timestamp=1645891313020, value=3   
     
     #在排序时,首先按照rk进行升序排序;当rk相等,就按照列簇和列名的大小进行升序排序;
      当rk和列簇列名一样时,按照版本的时间戳进行自然降序排序,三个排序成为三维有序
    
测试表是否存在
exists \'表名\'

举例:exists \'test\'
结果:
Table test does exist
0 row(s) in 0.7120 seconds

举例:exists \'test5\'
结果:
Table test5 does not exist
0 row(s) in 0.0240 seconds
统计表的记录数
count \'表名\'  {INTERVAL =>m, CACHE =>n}

INTERVAL表示多少行显示一次及对应的rowkey,默认1000;
CACHE每次去取的缓存区大小,默认是10;
调整该参数可提高查询速度,根据自己的需求来调整

3、多版本案例说明

  • 建表
create \'test\',\'info\'
  • 加载数据
put \'test\',\'000\',\'inf0:name\',\'zhaosi\'

注意:
	加载数据的时候要自行设定rowkey
	指定列簇名,并设定列名
  • 获取数据
get \'test\',\'000\'

#结果
COLUMN                  CELL                                      
info:name               timestamp=1645864553447, value=zhaosi
1 row(s) in 0.0150 seconds

#解释
在Hbase中每个数据都是k-v格式,k表示的是rowkey,本例中是000
v有自己的列名,列名统一归于列簇,表示为 列簇名:列名,本例中是 info:name  
v的最终数据存放在CELL(单元格)中,每次存放的时候都会产生一个时间戳。
时间戳的目的:(1)产生存放记录 (2)使CELL可以存放多版本数据
  • 再添加一行数据
put \'test\',\'000\',\'info:age\',24
  • 再获取数据
get \'test\',\'000\'

#结果
COLUMN                  CELL                                                   
info:age                timestamp=1645865582802, value=24               
info:name               timestamp=1645864553447, value=zhaosi                   
1 row(s) in 0.0230 seconds

#解释
由结果我们可以看到,先后两次插入数据,再次获取数据,得到的是两行数据,
其实这两行数据算是一条数据,以为两次插入的属于rowkey是一样的;
想要查看表里有几条数据,查看有几个rk就行了
  • 再像表格里插入一行数据
put \'test\',\'000\',\'info:age\',23
  • 再次获取数据
get \'test\',\'000\'、

#结果
COLUMN                  CELL                
info:age                timestamp=1645874985339, value=22                       
info:name               timestamp=1645864553447, value=zhaosi     
1 row(s) in 0.0210 seconds

#解释
由此可见,此次添加的数据将原来的数据给覆盖掉了,因为他们的rk和列簇都一样

4、表结构分析

#查询表结构
hbase(main):005:0> desc \'test\'
Table test is ENABLED                                                           
test    
COLUMN FAMILIES DESCRIPTION                                                     
{NAME => \'info\', BLOOMFILTER => \'ROW\', VERSIONS => \'1\', IN_MEMORY => \'false\', KEEP_DELETE
D_CELLS => \'FALSE\', DATA_BLOCK_ENCODING => \'NONE\', TTL => \'FOREVER\', COMPRESSION => \'NONE
\', MIN_VERSIONS => \'0\', BLOCKCACHE => \'true\', BLOCKSIZE => \'65536\', REPLICATION_SCOPE => 
\'0\'}   
1 row(s) in 0.1260 seconds

#分析
1、查询Hbase表结构的时候,主要显示的是对列簇的一些描述
2、COLUMN FAMILIES DESCRIPTION----列簇的一些描述
3、NAME => \'info\'----列簇名
4、BLOOMFILTER => \'ROW\'----布卢姆过滤器
5、VERSIONS => \'1\'----表示版本
6、IN_MEMORY => \'false\'----是否放在内存中
7、KEEP_DELETED_CELLS => \'FALSE\'----是否保留删除的单元格
8、DATA_BLOCK_ENCODING => \'NONE\'----数据块编码
9、TTL => \'FOREVER\'----存活时间‘永远’
10、COMPRESSION => \'NONE----压缩
11、MIN_VERSIONS => \'0\'----最小版本
12、BLOCKCACHE => \'true\'----块缓存
13、BLOCKSIZE => \'65536\'----阻碍
14、REPLICATION_SCOPE => \'0\'----复制范围

5、数据的多版本设置

在列簇中的默认版本为1:VERSIONS => \'1\',
当rk、列簇名、列名一样时,多次传入不同的数据,
最终只会显示最后一次插入的数据,就是因为默认版本为1.

我们可以通过命令,在创建表的时候,修改列簇的默认版本
	create \'表名\',{NAME=>\'列簇名\',VERSIONS=>\'n\'}
n表示我们想要设置的版本号,n=5,说明最多可以保存5个版本

想要获取多版本数据,要加上{COLUMN=>\'列簇名\',VERSIONS=>\'m\'}
版本号m,表示想要获取m个版本的数据
	get \'表名\',\'rk\',{COLUMN=>\'列簇名\',VERSIONS=>\'m\'}
	
注意:
当获取数据的时候,不加上{COLUMN=>\'列簇名\',VERSIONS=>\'m\'},获取的是最后插入的一个数据
多版本举例
建表,并设置数据版本为3
create \'test1\',{NAME=>\'info\',VERSIONS=>\'3\'}

插入数据
put \'test1\',\'000\',\'info:age\',18
put \'test1\',\'000\',\'info:age\',19
put \'test1\',\'000\',\'info:age\',20
put \'test1\',\'000\',\'info:age\',21
put \'test1\',\'000\',\'info:age\',22

获取数据
get \'test1\',\'000\',{COLUMN=>\'info\',VERSIONS=>2}

结果
COLUMN                  CELL                                                   
 info:age               timestamp=1645879728158, value=22                       
 info:age               timestamp=1645879723180, value=21                       
1 row(s) in 0.0350 seconds

注意:
	(1)获取的版本号,如果大于我们设置的版本数量,不会报错,但是最多只能显示我们设置的版本数量
	(2)我们插入了5条数据,版本数量为3,那么前两次插入的数据真正意义上并没被删除,将会被标记下来

分类:

技术点:

相关文章: