使用HBase处理海量数据系列—Part2—初步了解

这是介绍Apache HBase系列文章的第二篇。第一篇文章中对HBase进行了整体介绍。本文主要介绍如何通过命令行shell与HBase进行交互。

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

$ 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)数据。数据行是由包含的列组成的,所以如果行中没有任何列理论上它是不存在的。接着上面的列子,下面会从一个数据行中删除一些指定的列。

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月。

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的整体架构。

原文链接: dzone 翻译: ImportNew.com - 陈 晨
译文链接: http://www.importnew.com/8408.html
[ 转载请保留原文出处、译者和译文链接。]

关于作者: 陈 晨

致力于互联网大型分布式领域,实践各种软件过程与自动化。爱生活,爱JAVA。新浪微博: 一酌散千忧

查看陈 晨的更多文章 >>



相关文章

发表评论

Comment form

(*) 表示必填项

还没有评论。

跳到底部
返回顶部