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

hbase基本概念和hbase shell常用命令用法

2014-06-15 13:18 645 查看
http://www.cnblogs.com/end/archive/2012/08/23/2652451.htm

HBase是一个分布式的、面向列的开源数据库,源于google的一篇论文《bigtable:一个结构化数据的分布式存储系统》。HBase是GoogleBigtable的开源实现,它利用HadoopHDFS作为其文件存储系统,利用Hadoop
MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。

2.HBase的表结构

HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族/列簇(columnfamily)。

RowKey
column-family1
column-family2
column-family3
column1
column2
column1
column2
column3
column1
key1
t1:abc

t2:gdxdf
t4:dfads

t3:hello

t2:world
key2
t3:abc

t1:gdxdf
t4:dfads

t3:hello
t2:dfdsfa

t3:dfdf
key3
t2:dfadfasd

t1:dfdasddsf
t2:dfxxdfasd

t1:taobao.com
如上图所示,key1,key2,key3是三条记录的唯一的rowkey值,column-family1,column-family2,column-family3是三个列族,每个列族下又包括几列。比如column-family1这个列族下包括两列,名字是column1和column2,t1:abc,t2:gdxdf是由rowkey1和column-family1-column1唯一确定的一个单元cell。这个cell中有两个数据,abc和gdxdf。两个值的时间戳不一样,分别是t1,t2,hbase会返回最新时间的值给请求者。

这些名词的具体含义如下:

(1)RowKey

与nosql数据库们一样,rowkey是用来检索记录的主键。访问hbasetable中的行,只有三种方式:

(1.1)通过单个rowkey访问

(1.2)通过rowkey的range

(1.3)全表扫描

Rowkey行键(Rowkey)可以是任意字符串(最大长度是64KB,实际应用中长度一般为10-100bytes),在hbase内部,rowkey保存为字节数组。

存储时,数据按照Rowkey的字典序(byteorder)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)

注意:

字典序对int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行键必须用0作左填充。

行的一次读写是原子操作(不论一次读写多少列)。这个设计决策能够使用户很容易的理解程序在对同一个行进行并发更新操作时的行为。

(2)列族columnfamily

hbase表中的每个列,都归属与某个列族。列族是表的chema的一部分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如courses:history,courses:math都属于courses这个列族。

访问控制、磁盘和内存的使用统计都是在列族层面进行的。实际应用中,列族上的控制权限能帮助我们管理不同类型的应用:我们允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因为隐私的原因不能浏览所有数据)。

(3)单元Cell

HBase中通过row和columns确定的为一个存贮单元称为cell。由{rowkey,column(=<family>+<label>),version}唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。

(4)时间戳timestamp

每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是64位整型。时间戳可以由hbase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。

为了避免数据存在过多版本造成的的管理(包括存贮和索引)负担,hbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。

3.HBaseshell的基本用法

hbase提供了一个shell的终端给用户交互。通过执行helpget可以看到命令的帮助信息。

以网上的一个学生成绩表的例子来演示hbase的用法。

name
grad
course
math
art
zkb
5
97
87
baoniu
4
89
80
这里grad对于表来说是一个列,course对于表来说是一个列族,这个列族由两个列组成math和art,当然我们可以根据我们的需要在course中建立更多的列族,如computer,physics等相应的列添加入course列族。图中需要注意的是90这个值,列族下面的列也是可以没有名字的。

(1)建立一个表格scores具有两个列族grad和courese

hbase(main):
001
:
0
>
create
'scores'
,
'grade'
,
'course'
0
row(s)
in
0.4780
seconds
(2)查看当前HBase中具有哪些表

hbase(main):
002
:
0
>
list
TABLE
scores
1
row(s)
in
0.0270
seconds
(3)查看表的构造

hbase(main):
004
:
0
>
describe
'scores'
DESCRIPTION
ENABLED
{NAME
=>
'scores'
,
FAMILIES=>[{NAME=>
'course'
,
BLOOMFILTER=>
'NONE'
,
REPLICATION_SCOPE=>
'0'
,
true
COMPRESSION
=>
'NONE'
,
VERSIONS=>
'3'
,
TTL=>
'2147483647'
,
BLOCKSIZE=>
'65536'
,
IN_MEMORY=>'fal
se
',
BLOCKCACHE=>'
true
'},
{NAME=>'
grade
',
BLOOMFILTER=>'
NONE
',
REPLICATION_SCOPE=>'
0
',
COMPR
ESSION
=>
'NONE'
,
VERSIONS=>
'3'
,
TTL=>
'2147483647'
,
BLOCKSIZE=>
'65536'
,
IN_MEMORY=>
'false'
,
BLOCKCACHE
=>
'true'
}]}
1
row(s)
in
0.0390
seconds
(4)加入一行数据,行名称为zkb列族grad的列名为””值位5

hbase(main):
006
:
0
>
put
'scores'
,
'zkb'
,
'grade:'
,
'5'
0
row(s)
in
0.0420
seconds
(5)给zkb这一行的数据的列族course添加一列<math,97>

hbase(main):
007
:
0
>
put
'scores'
,
'zkb'
,
'course:math'
,
'97'
0
row(s)
in
0.0270
seconds
(6)给zkb这一行的数据的列族course添加一列<art,87>

hbase(main):
008
:
0
>
put
'scores'
,
'zkb'
,
'course:art'
,
'87'
0
row(s)
in
0.0260
seconds
(7)加入一行数据,行名称为baoniu列族grad的列名为””值为4

hbase(main):
009
:
0
>
put
'scores'
,
'baoniu'
,
'grade:'
,
'4'
0
row(s)
in
0.0260
seconds
(8)给baoniu这一行的数据的列族course添加一列<math,89>

hbase(main):
010
:
0
>
put
'scores'
,
'baoniu'
,
'course:math'
,
'89'
0
row(s)
in
0.0270
seconds
(9)给Jerry这一行的数据的列族course添加一列<art,80>

hbase(main):
011
:
0
>
put
'scores'
,
'baoniu'
,
'course:art'
,
'80'
0
row(s)
in
0.0270
seconds
(10)查看scores表中zkb的相关数据

hbase(main):
012
:
0
>
get
'scores'
,
'zkb'
COLUMN
CELL
course:art
timestamp=
1316100110921
,
value=
87
course:math
timestamp=
1316100025944
,
value=
97
grade:
timestamp=
1316099975625
,
value=
5
3
row(s)
in
0.0480
seconds
(11)查看scores表中所有数据

注意:scan命令可以指定startrow,stoprow来scan多个row,例如:scan'user_test',{COLUMNS=>'info:username',LIMIT=>10,STARTROW=>'test',STOPROW=>'test2'}

hbase(main):
013
:
0
>
scan
'scores'
ROW
COLUMN+CELL
baoniu
column=course:art,timestamp=
1316100293784
,
value=
80
baoniu
column=course:math,timestamp=
1316100234410
,
value=
89
baoniu
column=grade:,timestamp=
1316100178609
,
value=
4
zkb
column=course:art,timestamp=
1316100110921
,
value=
87
zkb
column=course:math,timestamp=
1316100025944
,
value=
97
zkb
column=grade:,timestamp=
1316099975625
,
value=
5
2
row(s)
in
0.0470
seconds
(12)查看scores表中所有数据courses列族的所有数据

hbase(main):
017
:
0
>
scan
'scores'
,{COLUMNS
=>
'course'
}
ROW
COLUMN+CELL
baoniu
column=course:art,timestamp=
1316100293784
,
value=
80
baoniu
column=course:math,timestamp=
1316100234410
,
value=
89
zkb
column=course:art,timestamp=
1316100110921
,
value=
87
zkb
column=course:math,timestamp=
1316100025944
,
value=
97
2
row(s)
in
0.0350
seconds
(13)删除scores表

hbase(main):
024
:
0
>
disable
'scores'
0
row(s)
in
0.0330
seconds
hbase(main):
025
:
0
>
drop
'scores'
0
row(s)
in
1.0840
seconds
总结下,hbaseshell常用的操作命令有create,describe,disable,drop,list,scan,put,get,delete,deleteall,count,status等,通过help可以看到详细的用法。
http://blog.itpub.net/7607759/viewspace-759609/
[grid@hdnode3~]$hbaseshell
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: