导航:使用HBase处理海量数据系列文章共5章:1、HBase的概要介绍;2、初步了解HBase交互;3、HBASE架构了解;4、HBase中Java API使用;5、数据建模。
这是介绍Apache HBase系列文章的第二篇。第一篇文章中对HBase进行了整体介绍。本文主要介绍如何通过命令行shell与HBase进行交互。
我们来了解如何通过命令行使用HBase。HBase自带基于JRuby开发的shell工具,能够定义和管理表、对数据执行增删改查操作、扫描表以及执行一些相关的维护。进入shell后,输入help就能获得完整的帮助信息。也可以使用 help <group> 命令来获得指定命令或者命令组的帮助信息。例如,help ‘create’ 就提供了关于创建新表的帮助信息。HBase在产品环境中应该部署到服务器集群中,但也可以下载下来然后启动运行一个单机模式,只需要花几分钟时间。第一件要做的事情就是使用HBase的shell。下面的示例中演示了通过shell新建一个博客表、展示HBase中的有效表、添加一个博客实体、查询该实体以及扫描博客表。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
$ bin /hbase shell HBase Shell; enter 'help<RETURN>' for list of supported commands. Type "exit<RETURN>" to leave the HBase Shell Version 0.96.0-hadoop2, r1531434, Fri Oct 11 15:28:08 PDT 2013 hbase(main):001:0> create 'blog' , 'info' , 'content' 0 row(s) in 6.0670 seconds => Hbase::Table - blog hbase(main):002:0> list TABLE blog fakenames my-table 3 row(s) in 0.0300 seconds => [ "blog" , "fakenames" , "my-table" ] hbase(main):003:0> put 'blog' , '20130320162535' , 'info:title' , 'Why use HBase?' 0 row(s) in 0.0650 seconds hbase(main):004:0> put 'blog' , '20130320162535' , 'info:author' , 'Jane Doe' 0 row(s) in 0.0230 seconds hbase(main):005:0> put 'blog' , '20130320162535' , 'info:category' , 'Persistence' 0 row(s) in 0.0230 seconds hbase(main):006:0> put 'blog' , '20130320162535' , 'content:' , 'HBase is a column-oriented...' 0 row(s) in 0.0220 seconds hbase(main):007:0> get 'blog' , '20130320162535' COLUMN CELL content: timestamp=1386556660599, value=HBase is a column-oriented... info:author timestamp=1386556649116, value=Jane Doe info:category timestamp=1386556655032, value=Persistence info:title timestamp=1386556643256, value=Why use HBase? 4 row(s) in 0.0380 seconds hbase(main):008:0> scan 'blog' , { STARTROW => '20130300' , STOPROW => '20130400' } ROW COLUMN+CELL 20130320162535 column=content:, timestamp=1386556660599, value=HBase is a column-oriented... 20130320162535 column=info:author, timestamp=1386556649116, value=Jane Doe 20130320162535 column=info:category, timestamp=1386556655032, value=Persistence 20130320162535 column=info:title, timestamp=1386556643256, value=Why use HBase? 1 row(s) in 0.0390 seconds |
上面的命令中,我们首先新建了一个包含列簇info 和 content的博客表。列出所有的表并且看到我们新建的博客表以后,我们向表中添加了一些数据。put命令指定了表名,唯一行主键,列簇的主键由列簇名和限定名(qualifier)组成,例如info是列簇名,而title和author就是限定名。所以,info:title就指向在列簇info中值为“Why use HBase?”的列title,info:title同样也被作为列主键。接下来,我们使用命令查询一行单独数据,并且最终在一个限定的行主键范围内扫描了博客表数据。指定了开始行20130300(包含)和结束行20130400 (不包含),和你预想的一样,我们能够查询到在此范围内的所有数据。上面博客的例子中,因为行主键就是发布的时间,所以实际上包含了所有2013三月份的数据。
HBase的一个重要特性就是,你定义了列簇,然后根据列限制名,可以再列簇中添加任意数量的列。HBase优化了磁盘的列存储方式,不存在的列不会占用空间,这样使得存储更有效率。而关系型数据库缺必须保存一个空值(null)数据。数据行是由包含的列组成的,所以如果行中没有任何列理论上它是不存在的。接着上面的列子,下面会从一个数据行中删除一些指定的列。
1
2
3
4
5
6
7
8
9
|
hbase(main):009:0> delete 'blog' , '20130320162535' , 'info:category' 0 row(s) in 0.0490 seconds hbase(main):010:0> get 'blog' , '20130320162535' COLUMN CELL content: timestamp=1386556660599, value=HBase is a column-oriented... info:author timestamp=1386556649116, value=Jane Doe info:title timestamp=1386556643256, value=Why use HBase? 3 row(s) in 0.0260 seconds |
如上所示,你能够从表中删除一个指定列如info:category。你也可以使用deleteall命令删除一行中的所有列,从而删除这行数据。更新数据的话,只需要再次使用put命令即可。HBase默认会保持单列三个版本的数据,所以假如你向 info:title put了一个新值,HBase会同时保留新旧两个值。
上面例子中的命令展示了如何在HBase中增、删、改、查数据。数据查询只有两种方式:使用get命令查询单行数据;通过scan查询多行数据。在HBase中查询数据时,你应当注意只查询你需要的信息。由于HBase是从每个列簇中分别获取数据,如果你只需要一个列簇的数据,就能够指定只获取该部分。下面的例子中,我们只查询博客 title 列,指定行主键范围为2013年3月到4月。
1
2
3
4
|
hbase(main):011:0> scan 'blog' , { STARTROW => '20130300' , STOPROW => '20130500' , COLUMNS => 'info:title' } ROW COLUMN+CELL 20130320162535 column=info:title, timestamp=1386556643256, value=Why use HBase? 1 row(s) in 0.0290 seconds |
通过设置行主键范围、限制需要的列名称、需要查询的数据版本,你能够优化HBase的数据访问。当然上面的例子中,全都是通过shell完成的,你也能够使用HBase的API完成相同甚至更多的事情。
总结
在这第二篇中,我们展示了如何通过shell来建表、插入数据,通过行主键查询数据,通过行主键范围进行数据查询。也了解了如何从表中某行数据删除指定列。
下一篇文章中,我们讲解了HBase的整体架构。
翻译: ImportNew.com - 陈 晨
译文链接: http://www.importnew.com/8408.html