这一篇博文是【大数据技术●降龙十八掌】系列文章的其中一篇,点击查看目录:大数据技术●降龙十八掌
系列文章:
:【十八掌●武功篇】第八掌:HBase之基本概念
【十八掌●武功篇】第八掌:HBase之Shell
【十八掌●武功篇】第八掌:HBase之基本操作Java API
【十八掌●武功篇】第八掌:HBase之过滤器总结
【十八掌●武功篇】第八掌:HBase之性能调优
【十八掌●武功篇】第八掌:HBase之安装与集成 [草稿]
HBase Shell 是基于JRuby的程序,启动HBase Shell命令行程序是在HBase客户端的bin目录下执行:
[centos@hadoop1 ~]$ hbase shell
进入Hbase Shell命令行后,输入help可以显示HBase Shell的帮助信息,命令概览如下表所示:
命令组 | 命令 | 描述 |
---|---|---|
general | status | 查看当前HBase集群的信息 status ‘deatiled’ 查看详细信息 |
table_help | 表操作的帮助文档 | |
version | 显示HBase的版本信息 | |
whoami | 当前客户端用户信息 | |
ddl | list | 列出当前HBase里所有的表 |
create | 创建表 | |
disable | 禁用表,删除表前要先禁用表 | |
enable | 启用表 | |
drop | 删除表 | |
describe | 查看表的详细信息 | |
alter | 修改表结构,给表添加列族 | |
exists | exists ‘test’ 判断表是否存在 | |
namespace | create_namespace | 创建一个新的命名空间 |
list_namespace | 查看有哪些命名空间 | |
describe_namespace | ||
alter_namespace | ||
drop_namespace | ||
dml | put | 添加数据 |
get | 获取数据。get ‘test’,’rowkey001’ | |
scan | 扫描数据。scan ‘test’ | |
delete | 删除数据 | |
deleteall | 删除一个rowkey对应的所有的数据 | |
count | 计数,Rowkey个数 | |
truncate | ||
tools | balance_switch | |
flush | 刷写数据,把数据从memstore刷写到stroefile里。 | |
major_compact | 合并 |
(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
(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
异步执行修改表结构命令。
(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表。
(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
(38) add_peer
(39) remove_peer
(40) list_peers
(41) enable_peer
(42) disable_peer
(43) start_replication
(44) stop_replication
(45) grant
给用户授权。
权限有:RWXCA。read、write、exec、create、admin。
(46) revoke
取消权限。
(47) user_permission
显示用户的授权许可状态。
hbase(main):016:0> user_permission ‘centos’
可以用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中的一行行的命令进行依次执行。
在启动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) 创建表时就给表变量赋值
--创建表,并将新建的表赋值给表变量,变量名为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]
(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表后再显式地再创建预分区表。
(1) 启动时指定Debug模式
$ ./bin/hbase shell -d
(2) 在Shell命令行内打开Debug开关
hbase(main):001:0> debug
Debug mode is ON