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

【转载】HBase基本概念和hbase shell常用命令用法

2015-07-16 20:09 681 查看
1.简介

  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'
DESCRIPTIONENABLED
{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'
COLUMNCELL
course:arttimestamp=
1316100110921
,value=
87
course:mathtimestamp=
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'
ROWCOLUMN+CELL
baoniucolumn=course:art,timestamp=
1316100293784
,value=
80
baoniucolumn=course:math,timestamp=
1316100234410
,value=
89
baoniucolumn=grade:,timestamp=
1316100178609
,value=
4
zkbcolumn=course:art,timestamp=
1316100110921
,value=
87
zkbcolumn=course:math,timestamp=
1316100025944
,value=
97
zkbcolumn=grade:,timestamp=
1316099975625
,value=
5
2
row(s)in
0.0470
seconds
  (12)查看scores表中所有数据courses列族的所有数据

hbase(main):
017
:
0
>scan
'scores'
,{COLUMNS=>
'course'
}
ROWCOLUMN+CELL
baoniucolumn=course:art,timestamp=
1316100293784
,value=
80
baoniucolumn=course:math,timestamp=
1316100234410
,value=
89
zkbcolumn=course:art,timestamp=
1316100110921
,value=
87
zkbcolumn=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可以看到详细的用法。

===========================================================================================

我们来了解如何通过命令行使用HBase。HBase自带基于JRuby开发的shell工具,能够定义和管理表、对数据执行增删改查操作、扫描表以及执行一些相关的维护。进入shell后,输入help就能获得完整的帮助信息。也可以使用help<group>命令来获得指定命令或者命令组的帮助信息。例如,help‘create’就提供了关于创建新表的帮助信息。HBase在产品环境中应该部署到服务器集群中,但也可以下载下来然后启动运行一个单机模式,只需要花几分钟时间。第一件要做的事情就是使用HBase的shell。下面的示例中演示了通过shell新建一个博客表、展示HBase中的有效表、添加一个博客实体、查询该实体以及扫描博客表。

上面的命令中,我们首先新建了一个包含列簇info和content的博客表。列出所有的表并且看到我们新建的博客表以后,我们向表中添加了一些数据。put命令指定了表名,唯一行主键,列簇的主键由列簇名和限定名(qualifier)组成,例如info是列簇名,而title和author就是限定名。所以,info:title就指向在列簇info中值为“WhyuseHBase?”的列title,info:title同样也被作为列主键。接下来,我们使用命令查询一行单独数据,并且最终在一个限定的行主键范围内扫描了博客表数据。指定了开始行20130300(包含)和结束行20130400
(不包含),和你预想的一样,我们能够查询到在此范围内的所有数据。上面博客的例子中,因为行主键就是发布的时间,所以实际上包含了所有2013三月份的数据。

HBase的一个重要特性就是,你定义了列簇,然后根据列限制名,可以再列簇中添加任意数量的列。HBase优化了磁盘的列存储方式,不存在的列不会占用空间,这样使得存储更有效率。而关系型数据库缺必须保存一个空值(null)数据。数据行是由包含的列组成的,所以如果行中没有任何列理论上它是不存在的。接着上面的列子,下面会从一个数据行中删除一些指定的列。

如上所示,你能够从表中删除一个指定列如info:category。你也可以使用deleteall命令删除一行中的所有列,从而删除这行数据。更新数据的话,只需要再次使用put命令即可。HBase默认会保持单列三个版本的数据,所以假如你向info:titleput了一个新值,HBase会同时保留新旧两个值。

上面例子中的命令展示了如何在HBase中增、删、改、查数据。数据查询只有两种方式:使用get命令查询单行数据;通过scan查询多行数据。在HBase中查询数据时,你应当注意只查询你需要的信息。由于HBase是从每个列簇中分别获取数据,如果你只需要一个列簇的数据,就能够指定只获取该部分。下面的例子中,我们只查询博客title列,指定行主键范围为2013年3月到4月。

通过设置行主键范围、限制需要的列名称、需要查询的数据版本,你能够优化HBase的数据访问。当然上面的例子中,全都是通过shell完成的,你也能够使用HBase的API完成相同甚至更多的事情。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: