- 内容提要
- 序
- 前言
- 第一部分 背景知识
- 第 1 章 Spring Data 项目
- 第 2 章 Repository:便利的数据访问层
- 第 3 章 使用 Querydsl 实现类型安全的查询
- 第二部分 关系型数据库
- 第 4 章 JPA Repository
- 第 5 章 借助 Querydsl SQL 实现类型安全的 JDBC 编程
- 第三部分 NoSQL
- 第 6 章 MongoDB: 文档存储
- 第 7 章 Neo4j:图数据库
- 第 8 章 Redis:键/值存储
- 第四部分 快速应用开发
- 第 9 章 使用 Spring Roo 实现持久层
- 第 10 章 REST Repository 导出器
- 第五部分 大数据
- 第 11 章 Spring for Apache Hadoop
- 第 12 章 使用 Hadoop 分析数据
- 第 13 章 使用 Spring Batch 和 Spring Integration 创建大数据管道
- 第六部分 数据网格
- 第 14 章 分布式数据网格:GemFire
- 关于封面
12.3 使用 HBase
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 交互式控制台
在这里创建了名为 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
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
示例 12-40 说明了如何使用基于 HBaseTemplate 的 UserRepository 类来查找所有的用户,并将用户添加到 HBase 中。
示例 12-40 基于 HBaseTemplate 的 UserRepository 类
在这个示例中,使用了匿名内部类来实现 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论