《MapReduce 2.0源码分析与编程实战》一2.1 从头开始

本节书摘来异步社区《MapReduce 2.0源码分析与编程实战》一书中的第2章,第2.1节,作者: 王晓华 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.1 从头开始

HBase实战
TwitBase存储3种简单的核心数据元素,即用户(user)、推帖(twit)和关系(relationship)。用户是TwitBase的中心。用户登录进入应用系统,维护用户信息,通过发帖与其他用户互动。推帖是TwitBase中用户公开发表的短文。推帖是用户间互动的主要模式。用户通过互相转发产生对话。所有互动的“粘合剂”就是关系。关系连接用户,使用户很容易读到其他用户的推帖。本章关注点是用户和推帖,下一章将讨论关系。

关于Java

本书绝大部分代码都是用Java编写的。有时我们使用伪代码来帮助理解概念,但是工作代码是Java。使用HBase,Java是现实的选择。整个Hadoop系列,包括HBase,都使用Java。HBase客户端函数库是Java,MapReduce函数库也是Java。HBase的部署需要优化JVM性能。但是可以使用非Java和非JVM的语言来访问HBase,第6章会讨论这些内容。

2.1.1 创建表

现在开始搭建TwitBase,为存储用户奠定一个基础。HBase是一个在表里存储数据的数据库,所以我们从创建users表开始。首先进入HBase Shell:


《MapReduce 2.0源码分析与编程实战》一2.1 从头开始

Shell打开一个到HBase的连接,给出提示符。在Shell提示符上,创建你的第一张表:


《MapReduce 2.0源码分析与编程实战》一2.1 从头开始


可以想到'users'是表的名字,但是'info'是什么呢?像关系型数据库里的表一样,HBase的表也是按照行(row)和列(column)来组织的。HBase中的列和关系型数据库中的有些不同。HBase中的列组成列族(column family)。info就是users表的一个列族。HBase中的表必须至少有一个列族。它们之中,列族直接影响HBase数据存储的物理特性。因此,创建表时必须至少指定一个列族。表创建后列族还可以更改,但是这么做很麻烦。后面我们会详细讨论列族,现在只需要知道users表足够简单,只有一个列族,就可以了。

2.1.2 检查表模式

如果你熟悉关系型数据库,会马上注意到,HBase创建表时没提到任何列或者数据类型。除了列族名字,HBase什么也不需要。这就是HBase经常被称作无模式数据库的原因。

你可以要求HBase列出所有已创建的表来验证users表已经创建成功:


《MapReduce 2.0源码分析与编程实战》一2.1 从头开始


list命令可以显示存在的表,HBase也可以提供表的更多细节。使用describe命令可以看到这个表的所有的默认参数:


《MapReduce 2.0源码分析与编程实战》一2.1 从头开始


Shell显示表有两类属性信息:表的名字和列族的列表。每个列族有许多相应的配置信息细节,这些就是我们前面提到的物理特性。现在先不管这些细节,我们随后研究它们。

HBase Shell

虽然HBase Shell主要用于管理任务,但它拥有丰富的特性。它用JRuby实现,可以使用整个Java客户端API。你可以使用help命令进一步发掘Shell的功能。

2.1.3 建立连接

尽管Shell很好用,但是谁会愿意用Shell命令实现TwitBase呢?聪明的HBase开发人员知道这一点,他们为HBase提供了一个全面的Java客户端库。也有面向其他语言的类似的API,第6章会讨论。现在我们使用Java。打开users表连接的Java代码如下所示:


《MapReduce 2.0源码分析与编程实战》一2.1 从头开始

类似于Shell的做法,构造函数HTable读取默认配置信息来定位HBase。然后定位之前你创建的users表,返回一个句柄。

你也可以传递一个定制的配置对象给HTable对象:


《MapReduce 2.0源码分析与编程实战》一2.1 从头开始

这等同于让HTable对象自己创建配置信息对象。你可以像下面这样设定参数来定制配置信息:


《MapReduce 2.0源码分析与编程实战》一2.1 从头开始


HBase客户端配置信息

HBase客户端应用需要有一份HBase配置信息来访问HBase——ZooKeeper quorum地址。你可以手工设定这个配置如下:

`  ``MyConf.set("hbase.zookeeper.quorum","serverip");`

ZooKeeper以及客户端与HBase集群之间的交互会在下一章深入研究分布式HBase存储时讨论到。现在你只需要知道HBase配置信息可以通过两种方式获取,一种是Java客户端从类路径里的hbase-site.xml文件里获取配置信息,另一种是通过在连接中显式设定配置信息来获取。如果你没有指定配置信息,就像示例代码里那样,客户端就会使用默认配置信息,把localhost作为ZooKeeper quorum 地址。单机模式中,指的就是你用来验证本书内容的机器,这正是你需要的配置信息。

2.1.4 连接管理

创建一张表实例是个开销很大的操作,需要占用一些网络资源。与直接创建表句柄相比,使用连接池更好一些。连接从连接池里分配,然后再返回到连接池。实践中,使用HTablePool比直接使用HTable更为常见:


《MapReduce 2.0源码分析与编程实战》一2.1 从头开始

当你完成工作关闭表时,连接资源会返回到连接池里。

没有数据的表是没有用的,现在我们存储一些数据。

上一篇:Java同步关键字synchronize底层实现原理(下)


下一篇:【Qt编程】基于Qt的词典开发系列<三>--开始菜单的设计