您的位置:首页 > 运维架构 > Shell

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

2017-12-01 08:43 295 查看
这一篇博文是【大数据技术●降龙十八掌】系列文章的其中一篇,点击查看目录:

大数据技术●降龙十八掌


系列文章:

:【十八掌●武功篇】第八掌: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


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

大数据技术●降龙十八掌
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hbase 大数据