HBase常用Shell命令

46 篇文章 6 订阅
13 篇文章 0 订阅

HBase提供了一个非常方便的命令行交互工具HBase Shell。通过HBase Shell,HBase可以与MySQL命令行一样创建表、索引,也可以增加、删除和修改数据,同时集群的管理、状态查看等也可以通过HBase Shell实现。

一、数据定义语言

数据定义语言(Data Definition Language,DDL),包括数据库表的创建、修改等语句。

1,创建表

创建表的语句如下:
create 's_behavior', {NAME => 'pc'} , {NAME => 'ph'}
该语句创建了一个s_behavior表,用来存储用户的行为数据,这个表有两个列族,列族pc用来存储用户PC端的用户行为数据,列族ph用来存储用户手机端的用户行为数据。

2,查看所有表

查看所有表的语句如下:
list
该语句会列出HBase数据库中所有已经创建的表。

3,查看已创建的表

查看已创建的表的语句如下:
describe 's_behavior'

在这里插入图片描述
虽然在创建表的时候没有指定任何属性,但是HBase默认会给表设置一些属性:
(1)BLOOMFILTER:布隆过滤器。做Scan操作时用来排除待扫描的存储文件,第9章会有详细描述。
(2)IN_MEMORY:数据是否常驻块缓存。一般只有HBase系统的元数据表才会设置为true。
(3)VERSIONS:对这个表HBase应该保留多少个数据版本。HBase对表的数据行可以保留多个数据版本,以时间戳来区分。
(4)KEEP_DELETED_CELLS:保留删除的数据。意味着可以通过Get或者Scan请求获取已经被删除的数据(如果数据删除后经过了一次大合并,那么这些删除的数据也会被清理),只要这行数据的时间戳在查询的时间范围即可。注意,如果需要开启集群间复制,则这个属性必须为true,否则可能导致数据复制失败。
(5)DATA_BLOCK_ENCODING:数据块编码。用类似于压缩算法的编码形式来节省存储空间,主要是针对行键,用时间换空间,默认情况下不启用数据块编码,第9章会有详细描述。
(6)COMPRESSION:压缩方式。HBase提供了多种压缩方式(如Snappy、LZO、gzip等)用来在数据存储到磁盘之前对数据进行压缩,以减少存储空间。第9章也会详细介绍并对比各种压缩方式。
(7)TTL:存活时间(Time To Live),数据的有效时长。超过有效时长的数据在大合并的时候会被删除。
(8)BLOCKSIZE:HBase读取数据的最小单元。设置过大会导致读取很多不需要的数据,过小则会产生更多的索引文件,默认大小为64 KB。
(9)REPLICATION_SCOPE:集群间数据复制的开关。当集群间数据复制配置好后,REPLICATION_SCOPE=1表示开启复制。默认值为0,表示不开启复制。

4,修改表

修改表的模式(schema)之前需要先将表下线,然后执行修改的命令,再上线。下面的代码将s_behavior表修改为开启集群间复制:
disable 's_behavior'
alter 's_behavior', 
{NAME=>"cf", REPLICATION_SCOPE=>"1", KEEP_DELETED_CELLS => 'TRUE'}enable 's_behavior'

二、数据操纵语言

数据操纵语言(Data Manipulation Language,DML)包括插入、获取、扫描数据的put命令、get命令、scan命令,以及删除数据的delete命令、deleteall命令和truncate命令。

1,put命令

put命令用来插入一行数据到HBase表。

格式:
put <table>,<rowkey>,<列族:列限定符>,<值>
示例:
hbase(main):004:0> put 's_behavior','12345_1516592489001_1','pc:v','1001'
0 row(s) in 0.2020 seconds

hbase(main):005:0> put 's_behavior','12345_1516592489001_1','ph:o','1001'
0 row(s) in 0.0050 second
第一条命令插入一条用户PC端行为数据,
第二条命令插入一条用户手机端行为数据。
注意,两条命令行键相同,只是指定了不同的列族,因此实际上两条数据在HBase中逻辑上是同一条数据。之后用该行键可以唯一地定位到这两个列族的数据。

2,get命令

get命令用来根据行键获取HBase表的一条记录。

格式:
get <table>,<rowkey>
示例:
使用get命令通过行键获取表s_behavior的一行数据,包括这行数据的所有列族:
hbase(main):006:0> get 's_behavior','12345_1516592489001_1'
COLUMN                             CELL 
pc:v                         timestamp=2022-01-24T19:33:18.352, value=1001 
ph:o                         timestamp=2022-01-24T19:33:35.071, value=1001
2 row(s) in 0.0330 seconds

通过给get命令指定时间戳来获取一行数据某个时刻的镜像:
hbase(main):007:0> get 's_behavior','12345_1516592489001_1' , {TIMESTAMP => '1643023998352'}
COLUMN                             CELL 
pc:v                         timestamp=2022-01-24T19:33:18.352, value=1001
1 row(s) in 0.0120 seconds

get命令也支持获取数据的多个版本,但是需要在创建表的语句中指定VERSIONS属性。先修改表支持多个版本,然后用get命令获取多个版本的数据:
hbase(main):008:0> alter 's_behavior',NAME=>'pc',VERSIONS =>3
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.9370 seconds

hbase(main):009:0> put 's_behavior','12345_1516592489001_1','
pc:v','1002'
0 row(s) in 0.0100 seconds

hbase:010:0> get 's_behavior','12345_1516592489001_1',{COLUMN => 'pc:v',VERSIONS=>2}
COLUMN                        CELL 
pc:v                     timestamp=2022-01-24T19:49:20.398, value=1002 
pc:v                     timestamp=2022-01-24T19:33:18.352, value=1001
1 row(s)Took 0.0266 seconds

3,scan命令

scan命令用来扫描表的数据。scan命令是HBase数据查询命令中最复杂的命令,需要特别注意查询的数据量,以免由于扫描数据过大导致HBase集群出现响应延迟。

格式:
scan <table>
示例:
使用scan命令来查询表s_behavior中的所有记录:
hbase(main):012:0* scan 's_behavior'
ROW                            COLUMN+CELL 
12345_1516592489001_1  column=pc:v, timestamp=2022-01-24T19:49:20.398, value=1002 12345_1516592489001_1  column=ph:o, timestamp=2022-01-24T19:33:35.071, value=1001
1 row(s) in 0.0120 seconds

(1)获取时间区间内数据

示例:
使用时间区间获取“1643021990187<=时间戳<1643023998353”的数据:
hbase(main):013:0> scan 's_behavior', {TIMERANGE => [1643021990187,1643023998353]}
ROW                               COLUMN+CELL 
12345_1516592489001_1     column=ph:o, timestamp=2022-01-24T19:33:18.352, value=1001
1 row(s) in 0.0190 seconds

(2)获取多个版本数据

示例:
使用VERSIONS参数获取表的两个版本数据:
hbase(main):003:0* scan 's_behavior', {VERSIONS=>2}
ROW                           COLUMN+CELL 
12345_1516592489001_1  column=pc:v, timestamp=2022-01-24T19:49:20.398, value=1002 
12345_1516592489001_1  column=pc:v, timestamp=2022-01-24T19:33:18.352, value=1001 
12345_1516592489001_1  column=ph:o, timestamp=2022-01-24T19:33:35.071, value=1001
1 row(s) in 0.1200 seconds

(3)获取用户前几行数据

示例:
获取ID为12345的用户的前5行数据:
hbase(main):013:0* scan 's_behavior', {FILTER => "PrefixFilter('12345_')" ,COLUM
NS => ['pc'],LIMIT=>5}ROW                               COLUMN+CELL 
12345_1516592489001_1     column=pc:v, timestamp=1521442781396, value=1002 
12345_1516592489001_2     column=pc:v, timestamp=1521442781447, value=1003 
12345_1516592489001_3     column=pc:v, timestamp=1521442781471, value=1004 
12345_1516592489001_4     column=pc:v, timestamp=1521442781492, value=1005 
12345_1516592489001_5     column=pc:v, timestamp=1521442781513, value=1006
5 row(s) in 0.0240 seconds

因为表s_behavior的行键都是以用户ID开头,所以可以使用一个前缀过滤器。注意,需要在用户ID(12345)后面带上下划线,否则会匹配到行键为123450_xxx等类似的数据。

(4)获取某个用户某个时间区间内产生的PC端行为数据

scan命令可以指定扫描开始和结束行键。

示例:
获取ID为12345的用户的某个时间区间内产生的PC端行为数据,使用STARTROW、STOPROW参数指定扫描一个前闭后开的区间,即“STARTROW<=行键<STOPROW”:
hbase(main):014:0> scan 's_behavior', {STARTROW =>
'12345_1516592489001' ,STOPROW=>'12345_15165924890
02' ,COLUMNS => ['pc']}ROW                           COLUMN+CELL 
12345_1516592489001_1  column=pc:v, timestamp=2022-01-24T19:33:35.071, value=1002 
12345_1516592489001_2  column=pc:v, timestamp=2022-01-24T19:34:01.012, value=1003 
12345_1516592489001_3  column=pc:v, timestamp=2022-01-24T19:34:01.012, value=1004 
12345_1516592489001_4  column=pc:v, timestamp=2022-01-24T19:34:02.062, value=1005 
12345_1516592489001_5  column=pc:v, timestamp=2022-01-24T19:34:02.076, value=1006 
12345_1516592489001_6  column=pc:v, timestamp=2022-01-24T19:34:03.089, value=1007 
12345_1516592489001_7  column=pc:v, timestamp=2022-01-24T19:34:04.011, value=1008 
12345_1516592489001_8  column=pc:v, timestamp=2022-01-24T19:34:05.171, value=1009
8 row(s) in 0.0320 seconds

(5)获取用户对某种商品的行为数据

示例:
第一条命令查询表s_behavior中列值等于1001的数据,第二条命令查询表s_behavior中列值包含1002的数据:
hbase(main):015:0> scan 's_behavior', FILTER=>"ValueFilter(=,'binary:1001')"
ROW                              COLUMN+CELL 
12345_1516592489001_1  column=pc:v, timestamp=2022-01-24T19:33:18.352, value=1001 
12345_1516592489001_1  column=ph:o, timestamp=2022-01-24T19:33:35.071, value=1001
1 row(s) in 0.0430 seconds

hbase(main):016:0> scan's_behavior',FILTER=>"ValueFilter(=,'substring:1002')"
ROW                                           COLUMN+CELL 
12345_1516592489001_1  column=pc:v, timestamp=2022-01-24T19:33:18.352, value=1002
1 row(s) in 0.0200 seconds

(6)获取某个用户行为数据的行键

示例:
获取ID为12345的用户的行为数据行键:
hbase(main):012:0> scan 's_behavior', {FILTER => "PrefixFilter('12345') AND
KeyOnlyFilter()" , LIMIT=>3}ROW                              COLUMN+CELL 
12345_1516592489001_1   column=pc:v, timestamp=2022-01-24T19:49:20.398, value= 
12345_1516592489001_1   column=ph:o, timestamp=2022-01-24T19:33:35.071, value= 
12345_1516592489001_2   column=pc:v, timestamp=2022-01-24T19:35:32.011, value= 
12345_1516592489001_3   column=pc:v, timestamp=2022-01-24T19:35:33.169, value=
3 row(s) in 0.0470 seconds

4,delete命令、deleteall命令和truncate命令

HBase提供了delete、deleteall和truncate命令分别用来删除列、行和表的数据。

(1)delete命令删除某列数据。

格式:
delete '<table>', '<rowkey>, '<列族:列限定符>', '[<time stamp>]'
示例:
使用下面的命令可以删除行键为12345_1516592489001_1的数据行中列族为ph、列限定符为o的数据:
hbase(main):014:0> delete 's_behavior', '12345_1516592489001_1' ,'ph:o'
0 row(s) in 0.0470 seconds

(2)deleteall命令删除整行数据。

格式:
deleteall '<table>', '<rowkey>
示例:
使用下面的命令可以删除了行键为12345_1516592489001_1的数据行:
hbase(main):015:0> deleteall 's_behavior', '12345_1516592489001_1'
0 row(s) in 0.0090 seconds

(3)truncate命令删除整表数据。

格式:
truncate '<table>'

示例:
使用下面的命令可以删除用户行为表s_behavior中的所有数据:
hbase(main):016:0> truncate 's_behavior'
Truncating 's_behavior' table (it may take a while): 
- Disabling table... 
- Truncating table...
0 row(s) in 3.4640 seconds

三、其他常用的Shell命令

1,复制状态查看

当HBase开启了集群间复制时,使用status命令可以查看复制的状态,包括复制延迟、待复制日志文件队列大小等。

示例:
hbase(main):017:0> status 'replication'
version 2.4.93 live servers    
master1:       
	SOURCE: PeerID=1, AgeOfLastShippedOp=4773835960, SizeOfLogQueue=2677,      
	TimeStampsOfLastShippedOp=Thu Jan 01 08:00:00 CST 1970,       
	Replication Lag=1521448279318       
	SINK  :AgeOfLastAppliedOp=0,       
	TimeStampsOfLastAppliedOp=Mon Dec 25 17:23:16 CST 2017    
slave1:       
	SOURCE: PeerID=1, AgeOfLastShippedOp=5986238820, SizeOfLogQueue=1665,       
	TimeStampsOfLastShippedOp=Thu Jan 01 08:00:00 CST 1970,       
	Replication Lag=1521448277282       
	SINK  :AgeOfLastAppliedOp=0,       
	TimeStampsOfLastAppliedOp=Mon Dec 25 11:10:14 CST 2017    
master2:       
	SOURCE:PeerID=1, AgeOfLastShippedOp=24121908, SizeOfLogQueue=7,       
	TimeStampsOfLastShippedOp=Mon Mar 19 09:46:36 CST 2018,       
	Replication Lag=24281038       
	SINK  : AgeOfLastAppliedOp=0,      
	TimeStampsOfLastAppliedOp=Tue Mar 13 17:02:06 CST 2018

2,分区拆分

实时在线集群一般会禁用自动拆分以免影响性能,因此当存储文件大小达到某个值后需要手动或者使用自动化程序将分区做拆分。例如,下面的代码将用户行为表s_behavior拆分为两个分区,由于行键以用户ID开始,而用户ID的第一个字符取值范围为0~9,中值为5,因此可以使用5作为拆分后两个分区的分割字符:

hbase(main):018:0>  split 's_behavior','5'
0 row(s) in 0.1060 seconds

3,分区大合并

实时在线集群会禁止大合并,应等到请求的非高峰期来定时做大合并。

示例:
手动触发大合并来压缩表s_behavior的分区,分区名称可以在HBase Web UI找到:
hbase(main):040:0> major_compact's_behavior,,1511878479015.e933a5867bd5253211a4ef90e549192f.'
0 row(s) in 0.0200 seconds

4,负载均衡开关

要对集群进行滚动升级,或者想要关闭自动负载均衡而采用手动负载均衡模式,可以使用下面的命令来开启或者关闭自动负载均衡:

hbase(main):019:0> balance_switch true
true
0 row(s) in 0.0220 seconds

hbase(main):020:0> balance_switch false
true
0 row(s) in 0.0090 seconds

5,分区手动迁移

如果有几个比较大的或者负载高的分区被分配到同一个分区服务器,那么这台分区服务器可能会成为整个HBase集群的瓶颈,这时候可以手动将这些分区迁移到负载低的分区服务器。

分区迁移命令格式:
move' <EncodedRegionName>',’<destServerName>’
示例:
EncodedRegionName的值是RegionName值的后缀部分,destServerName是在HBase Web UI上的分区服务器的全名。
hbase(main):002:0> move 'e933a5867bd5253211a4ef90e549192f', 'master2,16020,1513049558323'
0 row(s) in 0.0790 seconds

6,HBase运行Ruby脚本

在$HBASE_HOME/bin目录中有几个扩展名为rb的文件,可以直接使用HBase来运行这些Ruby脚本。

格式:
./hbase org.jruby.Main PATH_TO_SCRIPT
示例:
[hadoop@master1 bin]$ ./hbase org.jruby.Main get-active-master.rb
SLF4J: Class path contains multiple 
SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/hadoop/hadoop-2.10.1/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/hadoop/hbase-2.4.9/lib/client-facing-thirdparty/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
master1

文章来源:《HBase入门与实践(第2版)》 作者:彭旭

文章内容仅供学习交流,如有侵犯,联系删除哦!

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓之以理的喵~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值