【十八掌●武功篇】第八掌:HBase之Shell

这一篇博文是【大数据技术●降龙十八掌】系列文章的其中一篇,点击查看目录:这里写图片描述大数据技术●降龙十八掌


系列文章:
:【十八掌●武功篇】第八掌:HBase之基本概念
【十八掌●武功篇】第八掌:HBase之Shell
【十八掌●武功篇】第八掌:HBase之基本操作Java API
【十八掌●武功篇】第八掌:HBase之过滤器总结
【十八掌●武功篇】第八掌:HBase之性能调优
【十八掌●武功篇】第八掌:HBase之安装与集成 [草稿]

HBase Shell 是基于JRuby的程序,启动HBase Shell命令行程序是在HBase客户端的bin目录下执行:

[centos@hadoop1 ~]$ hbase shell

一、 HBase Shell命令概览

进入Hbase Shell命令行后,输入help可以显示HBase Shell的帮助信息,命令概览如下表所示:

命令组命令描述
generalstatus查看当前HBase集群的信息 status ‘deatiled’ 查看详细信息
table_help表操作的帮助文档
version显示HBase的版本信息
whoami当前客户端用户信息
ddllist列出当前HBase里所有的表
create创建表
disable禁用表,删除表前要先禁用表
enable启用表
drop删除表
describe查看表的详细信息
alter修改表结构,给表添加列族
existsexists ‘test’ 判断表是否存在
namespacecreate_namespace创建一个新的命名空间
list_namespace查看有哪些命名空间
describe_namespace
alter_namespace
drop_namespace
dmlput添加数据
get获取数据。get ‘test’,’rowkey001’
scan扫描数据。scan ‘test’
delete删除数据
deleteall删除一个rowkey对应的所有的数据
count计数,Rowkey个数
truncate
toolsbalance_switch
flush刷写数据,把数据从memstore刷写到stroefile里。
major_compact合并

二、 HBase Shell详解

1、 General一般命令组

(1) status
显示Hbase集群的状态信息,可以选择summary、simple、detailed三种显示模式,分别是显示概要、显示简单信息、显示详细信息。
举例:

hbase(main):009:0> status
hbase(main):009:0> status 'summary'
hbase(main):009:0> status 'simple'
hbase(main):009:0> status 'detailed'

(2) version
查询HBase版本信息

(3) whoami
显示当前用户信息。

hbase(main):010:0> whoami
centos (auth:SIMPLE)
    groups: centos, adm, wheel, systemd-journal
2、 表管理命令组

(1) alter
alter命令是修改表的列族结构。
举例:

--在表table1中添加一个列族f1,版本为2
hbase(main):013:0> alter 'table1',NAME=>'f1',VERSIONS=>2
--添加f2、f3两个列族,f1列族不变
alter 'table1','f1',{NAME=>'f2',VERSIONS=>1},{NAME=>'f3',VERSIONS=>3}
--删除列族
alter 'table1','delete'=>'f2'
--修改表的参数
alter 'table1',MAX_FILESIZE=>'134217728'
--添加一个协处理器,
--格式为:[coprocessor jar file location] | class name | [priority] | [arguments]
alter 'table1','coprocessor'=>'hdfs:///foo.jar|com.foo.FooRegionObserver|1001|arg1=1,arg2=2'
--移除表的参数
hbase> alter 't1’, METHOD => 'table_att_unset’, NAME => 'MAX_FILESIZE’
--移除一个协处理器
hbase> alter 't1’, METHOD => 'table_att_unset’, NAME => 'coprocessor$1'

(2) create
创建表的语句。
举例:

hbase> create 't1', {NAME => 'f1', VERSIONS => 5}
hbase> create 't1', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'} 
hbase> create 't1', 'f1', 'f2', 'f3'
hbase> create 't1', {NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true}
hbase> create 't1', {NAME => 'f1', CONFIGURATION => {'hbase.hstore.blockingStoreFiles' => '10'}}

(3) describe
查看表信息。
(4) disable
停用表
(5) disable_all
停用正则表达式所匹配的表
举例:

disable_all 't.*'

(6) is_disabled
判断一个表是否是停用状状态,如果是停用的,就返回true
举例:

is_disabled 'table1'

(7) drop
删除表

(8) drop_all
删除正则表达式说匹配的表。

(9) enable
启用表

(10) enable_all
启用正则表达式所匹配的表。

(11) is_enabled
判断表是否是启用状态,如果是启用状态,返回true

(12) exists
判断表是否存在

(13) list
如果list后面没有参数,就是列出所有的表。
如果list后面带了正则表达式,就只是列出所匹配的表。

(14) show_filters
显示HBase中所有的过滤器。
示例:

hbase(main):015:0> show_filters
ColumnPrefixFilter                                                                                                                                                          
TimestampsFilter                                                                                                                                                            
PageFilter                                                                                                                                                                  
MultipleColumnPrefixFilter                                                                                                                                                  
FamilyFilter                                                                                                                                                                
ColumnPaginationFilter                                                                                                                                                      
SingleColumnValueFilter                                                                                                                                                     
RowFilter                                                                                                                                                                   
QualifierFilter                                                                                                                                                             
ColumnRangeFilter                                                                                                                                                           
ValueFilter                                                                                                                                                                 
PrefixFilter                                                                                                                                                                
SingleColumnValueExcludeFilter                                                                                                                                              
ColumnCountGetFilter                                                                                                                                                        
InclusiveStopFilter                                                                                                                                                         
DependentColumnFilter                                                                                                                                                       
FirstKeyOnlyFilter                                                                                                                                                          
KeyOnlyFilter

(15) alter_status
协同前一个命令,可以查看alter进度,有几个region收到schema更改通知。

(16) alter_async
异步执行修改表结构命令。

3、 数据操纵命令

(17) count
通过MapReduce job来统计HBase表的行数,执行的是$HADOOP_HOME/bin/hadoop jar hbase.jar rowcount命令,INTERVAL参数是每隔多少行统计一次,默认是1000行,CACHE参数是缓存多少行,默认是10行。
举例:

hbase(main):002:0> count 'dealer:news',INTERVAL=>10000,CACHE=>100

(18) delete
根据确定的坐标,删除一行里的某一列数据或者删除某一列的小于指定版本的数据。
举例:

--删除表table1,RowKey为row1的行,列族为f3的c1列中的所有版本的值
hbase(main):022:0> delete 'table1','row1','f3:c1'
--删除单元格里,小于版本1499677619379的值
hbase(main):022:0> delete 'table1','row1','f3:c1',1499677619379

(19) deleteall
指定一个rowkey,删除这个rowkey里符合条件的值,可以删除所有列、某一列、某一个版本。
举例:

--删除某一个单元格的某一个版本
hbase(main):045:0> deleteall 'table1','row1','f3:c1',1499683038687
--删除某一列
hbase(main):051:0> deleteall 'table1','row1','f3:c1'
--删除某一行
hbase(main):060:0> deleteall 'table1','row1'

(20) get
获取一行后者一个单元格的内容,参数可以指定一个或多个列、时间戳、时间段、或者版本号。
举例:

--或者一个rowkey对应的数据,取一个版本
hbase(main):008:0> get 'table1','row1'
--或者一个rowkey下,一列的数据,取一个版本
hbase(main):009:0> get 'table1','row1','f3:c1'
hbase(main):011:0> get 'table1','row1',{COLUMNS=>'f3:c1'}
--获取两个列的数据
hbase(main):012:0> get 'table1','row1',{COLUMNS=>['f3:c1','f3:c2']}
--获取指定版本的数据
hbase(main):014:0> get 'table1','row1',{COLUMNS=>'f3:c1',TIMESTAMP=>1400552547}
--获取某一版本段内的数据,取最新的一个版本
hbase(main):017:0> get 'table1','row1',{COLUMNS=>'f3:c1',TIMERANGE=>[1400552545,1400552548]}
--根据版本段获取数据,取3个版本
hbase(main):018:0>get 'table1','row1',{COLUMNS=>'f3:c1',TIMERANGE=>[1400552545,1400552548],VERSIONS=>3}
--通过值过滤器查找row1行内的数据
hbase(main):020:0> get 'table1','row1',{FILTER=>"ValueFilter(=,'binary:v1')"}

(21) get_counter

hbase(main):026:0> get_counter 'table1','row1','f3:c2'

(22) incr

hbase(main):032:0> incr 'table1','row2','f3:c3',1

(23) put
向某一个单元格中插入一个值,可以指定时间戳

--向表table1的f3列族下的c1列,插入一个rowkey为row1,值为v2的单元格,版本时间戳为1400552546
hbase(main):032:0> put 'table1','row1','f3:c1','v2',1400552546

(24) scan
扫描显示表的数据,可以指定的参数有:TIMERANGE、FILTER、LIMIT、STARTROW、STOPROW、TIMESTAMP、MAXLENGTH、COLUMNS。

--查询表所有数据,默认是最新版本的
hbase(main):032:0> scan 'table1'
--查询表所有数据,显示三个版本的
hbase(main):033:0> scan 'table1',{VERSIONS=>3}
--查询时间戳段内的数据,区间段是前开后闭
hbase(main):034:0> scan 'table1',{TIMERANGE=>[1400552546,1499735688749]}
--指定返回Rowkey的个数
hbase(main):038:0> scan 'table1',{LIMIT=>1}
--指定StartRow和StopRow查询,区间段是前开后闭的
hbase(main):039:0> scan 'table1',{STARTROW=>'row1',STOPROW=>'row2'}
--查询指定时间戳的数据
hbase(main):040:0> scan 'table1',{TIMESTAMP=>1400552546}
--查询指定列的数据
hbase(main):042:0> scan 'table1',{COLUMNS=>'f3:c1'}

scan可以使用筛选器,两种方式使用筛选器:
1、 使用筛选字符串
2、 使用完整的filter的pageage名称来指定筛选器

--RAW为true时就是显示所有的值,包括删除了的。
hbase(main):048:0> scan 'table1',{VERSIONS=>5,RAW=>true}

(25) truncate
截断表,先Disable表然后drop表,再recreates表。

4、 HBase管理命令

(26) assign
分配Region,这个命令要小心使用,如果一个Region已经被分配了,如果执行assign命令,会强制分配Region。
举例:

hbase(main):002:0> assign 'weibo:demo2,\x00\x00\x00\x00\x00\x00\x00\x0D,1488330832597.c4a52b55c3d856e2fd666c304371edb9.'

(27) balancer
均衡Region命令。如果是返回true,说明已经成功通知了所有的region server去开始均衡region,region server均衡region的过程是异步的。

hbase(main):003:0> balancer
true

(28) balancer_switch
平衡器开关

hbase(main):004:0> balance_switch true
hbase(main):006:0> balance_switch false

(29) close_region
关闭region

(30) compact
合并Region。可以合并指定的表,也可以合并指定的列族。

hbase(main):007:0> compact 'table1'
hbase(main):008:0> compact 'table1','f3'

(31) major_compact

hbase(main):007:0> major_compact 'table1'
hbase(main):008:0> major_compact 'table1','f3'

(32) flush
刷写一个表的所有Region,或者刷写某一个Region。

--刷写一个表的所有Region
hbase(main):009:0> flush 'table1'
--刷写某一个Region
hbase(main):012:0> flush 'table1,,1499415496111.c4277ecd02d9de386264a82f7bcb2bd2.'

(33) move
移动一个Region。可以指定移动到哪个RegionServer上,如果不指定就会随机选择一个。
命令为:hbase> move ‘ENCODED_REGIONNAME’, ‘SERVER_NAME’
其中RegionName是编码后的,这一点要注意。Server_name是RegionServer的名称,通常是host,端口号,一个code。
(34) split
拆分整个表或者一个Region为两个Region。

--拆分某一个表
hbase(main):013:0> split 'table1'
--根据一个rowkey拆分表
hbase(main):014:0> split 'table1','key1'
--根据一个rowkey拆分Region
hbase(main):015:0> split 'regionName','splitKey'

(35) unassign
(36) hlog_roll
(37) zk_dump

5、 集群复制命令

(38) add_peer
(39) remove_peer
(40) list_peers
(41) enable_peer
(42) disable_peer
(43) start_replication
(44) stop_replication

6、 安全工具

(45) grant
给用户授权。
权限有:RWXCA。read、write、exec、create、admin。

(46) revoke
取消权限。

(47) user_permission
显示用户的授权许可状态。
hbase(main):016:0> user_permission ‘centos’

三、 执行Ruby脚本

可以用HBase Shell工具执行Ruby脚本文件,因为Hbase Shell工具就是Ruby语言写的,所有对Ruby脚本的支持很好。
Ruby脚本文件一般以.rb结束,执行语句为:

[centos@hadoop1 bin]$ ./hbase org.jruby.Main get-active-master.rb

四、 根据命令文件执行

可以将命令写入一个文件中,一行是一个命令,然后使用hbase shell来读取这个文件中的命令进行依次执行。
例如创一个文件:

[centos@hadoop1 bin]$ vi ~/com.txt
内容为:
list
desc ‘DLR:spring_data_test’

执行命令:

[centos@hadoop1 bin]$ hbase shell ~/com.txt

则会读取com.txt中的一行行的命令进行依次执行。

五、 指定VM参数

在启动HBase Shell时可以指定VM参数,指定的参数只是当次Shell有效,指定HBASE_SHELL_OPTS参数,并将参数放在hbase shell之前。
例如:

$ HBASE_SHELL_OPTS="-verbose:gc -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps \
  -XX:+PrintGCDetails -Xloggc:$HBASE_HOME/logs/gc-hbase.log" ./bin/hbase shell

六、 HBase Shell技巧

1、 表变量

在HBase Shell操作过程中,可以定一个变量,将一个或者多个表赋值给这个变量,在之后的对表的操作时,可以使用这个表变量来操作。

(1) 创建表时就给表变量赋值

--创建表,并将新建的表赋值给表变量,变量名为tab
hbase(main):021:0> tab=create 'table1','cf'
0 row(s) in 4.3040 seconds

=> Hbase::Table - table1
--使用tab变量,给表table1 put数据
hbase(main):022:0> tab.put 'rowkey1', 'cf:c1','v1'
0 row(s) in 0.0160 seconds
--使用表变量scan数据
hbase(main):023:0> tab.scan
ROW                           COLUMN+CELL                                                                        
 rowkey1                      column=cf:c1, timestamp=1499363918563, value=v1                                    
1 row(s) in 0.0180 seconds
--是用表变量get数据
hbase(main):024:0> tab.get 'rowkey1'
COLUMN                        CELL                                                                               
 cf:c1                        timestamp=1499363918563, value=v1                                                  
1 row(s) in 0.0300 seconds

(2) 已经存在的表赋值给表变量

--通过get_table来获取表,赋值给表变量t
hbase(main):025:0> t=get_table('table1')
0 row(s) in 0.0050 seconds
=> Hbase::Table - table1
--通过表变量操作
hbase(main):026:0> t.scan
ROW                           COLUMN+CELL                                                                        
 rowkey1                      column=cf:c1, timestamp=1499363918563, value=v1                                    
1 row(s) in 0.0170 seconds

(3) 表数组变量

--定义个变量tabs
hbase(main):005:0> tabs=list('tab.*')
TABLE                                                                                                            
table1                                                                                                           
1 row(s) in 0.0040 seconds

=> ["table1"]

--用map函数循环
hbase(main):007:0> tabs.map{|t| desc t;}
Table table1 is ENABLED                                                                                          
table1                                                                                                           
COLUMN FAMILIES DESCRIPTION                                                                                      
{NAME => 'cf', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => '1', CO
MPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536', 
IN_MEMORY => 'false', BLOCKCACHE => 'true'}                                                                      
1 row(s) in 0.1090 seconds
=> [nil]
2、 预分区

(1) 用数组指定分区点

可以在用HBase Shell创建表是进行预分区,最简单的预分区方式是在创建表的时候指定一个数组,数组里每一个字符串值是一个RowKey分割点,创建表时会根据字符串对应的二进制值来设立分割点。
举个栗子:

hbase(main):002:0> create 'table1','cf',SPLITS=>['10','20','30']

这个命令是创建了一个表table1,列族为cf,预分区为4个Region,三个分割点为\x31\x30、\x32\x30、\x33\x30,第一个Region里的rowkey从比10小的值到10,但是不包括10,第二个Region是从10(包括10)到20(不包括20),第三个Region是从20(包括10)到30(不包括30),第四个Region是从30(包括30)到更大的值。

(2) 用文件指定分区点

create 't14','f',SPLITS_FILE=>'~/splits.txt'

将分割点存入文件中,创建表时指定分割点文件来进行预分区。

(3) 指定分区算法


# create table with four regions based on random bytes keys
#用随机的分割点来预分区为4个Region
hbase>create 't2','f1', { NUMREGIONS => 4 , SPLITALGO => 'UniformSplit' }

# create table with five regions based on hex keys
#用十六进制字符串算法预分区分割为5个Region,适合rowkey为十六进制字符串的情况
hbase>create 't3','f1', { NUMREGIONS => 5, SPLITALGO => 'HexStringSplit' }

另外也可以自定义分区算法。
当truncate表时会丢失表的预分区信息,需要drop表后再显式地再创建预分区表。

3、 Debug模式

(1) 启动时指定Debug模式

$ ./bin/hbase shell -d

(2) 在Shell命令行内打开Debug开关

hbase(main):001:0> debug
Debug mode is ON

这一篇博文是【大数据技术●降龙十八掌】系列文章的其中一篇,点击查看目录:这里写图片描述大数据技术●降龙十八掌

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值