返回介绍

12.3 使用 HBase

发布于 2025-04-22 19:57:21 字数 4050 浏览 0 评论 0 收藏

HBase 是一个分布式的、面向列的数据库。它将数据建模成表并存储在 HDFS 中,并且具有可伸缩性以支持拥有数十亿行以及数百万列的表。如同 Hadoop 的 HDFS 和 MapReduce,HBase 也是模仿 Google 研发的技术来设计的。HBase 来源于 Google 的 BigTable 技术,该技术起源于 2006 年的一篇研究论文( http://research.google.com/archive/bigtable.html )。与 MapReduce 不同,HBase 提供了基于键的接近实时的数据访问,因此可用于交互式的、非批量操作的应用程序。

HBase 数据模型是由表组成的,这个表由唯一的键进行标识,并包含相关联的列。这些列组合在一起形成了列族(column family),所以经常一起访问的数据可以在磁盘中存储在一起以增加 I/O 的性能。存储于列的数据是一个键/值对集合,而不是像关系型数据库中常见的单个值。列族需要使用模式(schema)来描述并且需要预先定义,但以键/值对集合形式存储的值则不需要,这使得系统在演化上具有了很大的灵活性。数据建模有很多更深入的细节,必须彻底理解才能高效地使用 HBase。《 HBase: The Definitive Guide 》(O’Reilly 出版)是一本很好的 HBase 参考指南,它详细介绍了 HBase 的数据建模、架构、API 以及管理方式。

Spring for Apache Hadoop 为 HBase 应用的开发提供了一些基础却很便利的支持,可以很容易地配置 HBase 连接,它为 HBase 表提供了线程安全的数据访问方式,以及一个轻量级的对象-列数据映射功能。

12.3.1 Hello World

HBase 可从 HBase 主页( http://hbase.apache.org/ )下载。安装完发布版之后,执行 bin 目录下的 start-hbase.sh 脚本即可启动 HBase 服务。如同 Pig 和 Hive,HBase 也附带了一个交互式控制台,可以在 bin 目录下执行 hbase shell 将它启动。

进入交互控制台之后,即可开始建立表、定义列族以及为特定的列族增加行数据。示例 12-37 展示了以下功能:创建用户表、插入示例数据、根据键获取数据以及删除一行数据。

示例 12-37 使用 HBase 交互式控制台

P214

P215a

在这里创建了名为 cfInfo 和 cfStatus 的两个列族。键的名字在 HBase 被称为限定词(qualifiers),存储于 cfInfo 列族的是 username、email 和 password。cfStatus 列族存储其他的数据,这些数据通常不会与存储在 cfInfo 列族中的数据一起访问。例如,将 email 地址验证程序的状态放在 cfStatus 列族,但其他数据(例如使用者是否参与任何在线调查)也是可以包含进来的可选内容。deleteall 命令用来删除特定表和行中的所有数据。

12.3.2 使用 HBase Java 客户端

我们有很多可选的客户端 API 与 HBase 交互。本节所使用的是 Java 客户端,但也可以使用 REST、Thrift 以及 Avro 客户端。HTable 类是 Java 与 HBase 交互的主要方式。借助它,可以使用 Put 类将数据放入表中,使用 Get 类来根据键取出数据并使用 Delete 类来删除数据。查询数据则使用 Scan 类,可以指定键的范围以及过滤条件。示例 12-38 以 user1 作为键将一行数据放入之前建立的用户表中。

示例 12-38 HBase Put API

P215b

HBase API 要求以字节数组的形式来使用数据,而不是其他的原生类型。HTable 也不是线程安全的类,需要小心管理它所使用的底层资源并捕获 HBase 的异常。Spring 的 HBaseTemplate 类为使用 HBase 提供了较高层次的抽象。与其他 Spring 模板类一样,一旦创建之后,它是线程安全的并且可将异常转换到 Spring 便利的数据访问异常体系。类似 JdbcTemplat,它提供了一系列的回调接口,如 TableCallback、RowMapper 与 ResultsExtractor,这些接口可以封装常用的功能,例如将 HBase 的结果集映射到 POJO。

TableCallback 回调接口为 HBaseTemplate 的功能奠定了基础。它可以执行表查询、应用配置设置(例如何时刷新数据)、关闭表以及将任何抛出的异常转换为 Spring DAO 异常体系。RowMapper 回调接口的用途是将 HBase 的 ResultScanner 查询得到的一行记录映射成 POJO。HBaseTemplate 有几个重载的 find 方法,它们使用附加的条件并自动迭代 HBase 的 ResultScanner“结果集”对象,将每一行数据转换成一个 POJO,并且返回已映射对象的列表。请查看 Javadoc API( http://docs. spring.io/spring-hadoop/docs/current/api/ )以获取更详细的信息。若想要进一步控制映射程序(例如,数据行并不直接映射到一个 POJO 上时),ResultsExtractor 接口会传递给你一个 ResultScanner 对象,据此可以执行自定义的结果集迭代 程序。

创建与配置 HBaseTemplate 的方式是先创建一个 HBaseConfiguration 对象并将它传到 HBaseTemplate。示例 12-39 演示了如何使用 Spring 的 Hadoop XML 命名空间来配置 HBaseTemplate,而在纯 Java 代码中,也很容易以编程式的方式实现。

示例 12-39 配置 HBaseTemplate

P216a

示例 12-40 说明了如何使用基于 HBaseTemplate 的 UserRepository 类来查找所有的用户,并将用户添加到 HBase 中。

示例 12-40 基于 HBaseTemplate 的 UserRepository 类

P216b

P217

在这个示例中,使用了匿名内部类来实现 TableCallback 与 RowMapper 接口,但是通常的实现模式是建立一个独立的类,这让你可以在应用程序的各个部分重用映射逻辑。可以使用 HBase 开发更多的功能,让它尽可能与 Spring 对 MongoDB 的支持那样拥有丰富的功能,然而在编写本书的时候,我们已经看到有些人开始研究 Spring Hadoop 与 HBase 的交互以简化 HBase 应用开发的过程。此外,HBase 支持一致的配置与编程模型,可以将其延伸到 Spring Data 和其他 Spring 相关的项目之中。


[1] https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Thrift+API 。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。