1.3 你好HBase
HBase实战
HBase搭建在Apache Hadoop和Apache ZooKeeper上面。就像Hadoop家族其他产品一样,它是用Java编写的。HBase可以以3种模式运行:单机、伪分布式和全分布式。下面我们将使用的是单机模式。这意味着在一个Java进程里运行HBase的全部内容。这种访问模式用于研究HBase和做本地开发。
伪分布式模式需要在一台机器上运行多个Java进程。最后的全分布模式需要一个服务器集群。这两种模式需要安装相关联的软件包以及合理地配置HBase。这些内容将在第9章讨论。
HBase设计运行在nix系统上,代码和书中的命令都是为nix系统设计的。如果你使用Windows系统,最好的选择是安装一个Linux虚拟机。
关于Java的解释
HBase基本上用Java编写,只有几个部件不是,最优先支持的语言自然是Java。如果你不是Java开发员,在学习HBase时需要学习一些Java技能。本书的目标是指导你如何有效地使用HBase,很大篇幅内容关于如何使用API,它们都是Java的。所以,辛苦一点儿吧。
1.3.1 快速安装
以单机模式运行HBase,过程很简单。你可以选择Apache HBase 0.92.1版本,使用tar文件包进行安装。第9章会讨论其他各种发行版。如果你选择不同于Apache HBase 0.92.1的其他版本,也是可以使用的。本书的例子基于HBase 0.92.1版本(和Cloudera CDH4),其他API兼容的版本应该都可以正常工作。
HBase需要系统安装Java运行环境(JRE)。生产系统环境我们推荐Oracle的Java软件包。Hadoop和HBase社区测试了一些JRE版本,写作本书时HBase 0.92.1或CDH4的推荐版本是 Java 1.6.0_311。Java 7至今没有测试,因此并不推荐。安装HBase之前先在系统上安装Java。
到Apache HBase网站的下载区下载tar文件包(http:// hbase.apache.org/):
上述步骤从Apache镜像站点下载和解压了HBase的tar文件包。方便起见,创建一个环境变量指向这个目录,后面会比较省事。把它写入环境变量文件,以便每次打开Shell时不用重复设置。书中后面都会用到HBASE_HOME:
如果可以,把$HBASE_HOME/bin放进PATH变量,以便下次你可以直接执行hbase而不是$HBASE_HOME/bin/
hb``ase。
全部做完后,单机模式的HBase就安装成功了。HBase的配置信息主要在两个文件里:hbase-env.sh 和 hbase-site.xml。这两个文件存放在/etc/hbase/conf/目录下。单机模式的默认设置里,HBase写数据到目录/tmp 下,但是该目录不是长期保存数据的地方。你可以编辑hbase-site.xml文件,添加下面配置信息来将目录改到你指定的地方:
HBase安装成功后有一个简单管理界面,运行在端口http:// localhost:60010,如图1-2所示。
安装完成,HBase已经启动,现在开始使用HBase。
图1-2 HBase Master状态页面。该页面可以看到HBase的健康状态。也可以了解数据的分布,执行一些基本的管理任务,但是大部分管理任务不是在这个页面完成的。第10章将教你更多HBase运维知识
1.3.2 HBase Shell命令行交互
你可以使用HBase Shell,通过命令行方式和HBase进行交互。本地安装和集群安装都采用同样的Shell方式。HBase Shell是一个封装了Java客户端API的JRuby应用软件,有两种运行方式:交互模式和批处理模式。交互模式用于对HBase进行随时访问交互,批处理模式主要通过Shell脚本进行程序化交互或者用于加载小文件。在本章节我们使用交互模式。
JRuby和JVM语言
不熟悉Java的人可能被JRuby的概念搞迷糊了。JRuby是在Java运行时上面的Ruby编程语言的实现。除了正常的Ruby语法,JRuby支持访问Java对象和函数库。JVM上不仅仅只是Java和JRuby。Jython是JVM上Python的实现,还有一些完全不同的语言,如Clojure和Scala。所有这些语言都可以通过Java客户端API来访问HBase。
让我们开始使用交互模式。在终端中执行hbase shell命令启动Shell。Shell可以支持命令自动补全和命令文档内联访问:
走到这一步,可以确认Java和HBase函数库已经安装成功。为了最终验证,可以试试列出HBase中所有表的命令。这个动作执行了一个全程请求,从客户端应用到HBase服务器,然后返回。在Shell提示符下,输入list然后按下回车键。你应该看到输出0个结果,以及接下来的提示符:
完成安装和验证后,现在创建表并存储一些数据。
1.3.3 存储数据
HBase使用表作为顶级结构来存储数据。写数据到HBase,就是写数据到表。现在开始,创建一个有一个列族的表,名字是 mytable。是的,列族(别着急,后面会解释这个术语)。现在创建表:
1.写数据
表创建后,现在写入一些数据。我们往表里写入字符串hello HBase。按HBase的说法,我们这么说,“在'mytable'表的'first'行中的'cf:message'列对应的数据单元中插入字节数组'hello HBase'”能听懂吗?下一章我们会解释所有这些术语。现在,执行写入命令:
简单吧。HBase存储数字的方式和存储字符串一样。继续多增加几个值,如下:
现在表里有3行和3个数据单元。注意,在使用列的时候你并没有提前定义这些列,你也没有定义往每个列里存储的数据的类型。这就是NoSQL粉丝们所说的,HBase是一种无模式(schema-less)的数据库。如果写入数据后不能读取出来也是没有用的,现在读回数据看看。
2.读数据
HBase有两种方式读取数据:get和scan。你肯定敏锐地注意到了,HBase存储数据的命令是put。和put相对应,读取一行的命令是get。还记得我们说过,HBase除了键值API还有一些特别之处吗?scan就是这个特别所在。第2章会介绍scan是如何工作的以及为什么它很重要,同时会重点关注如何使用它。
现在执行get:
如上所示,你得到了第一行。Shell输出了该行所有数据单元,按列组织,输出值还附带时间戳。HBase可以存储每个数据单元的多个时间版本。存储的版本数量默认值是3个,但可以重新设置。读取的时候,除非特别指定,否则默认返回最新时间版本。如果你不希望存储多个时间版本,可以设置HBase只存储一个版本,但是绝不要禁用这个特性。
使用scan命令,你会得到多行数据。但是要小心,我们必须提醒你,除非特别指定,否则该命令会返回表里的所有行。现在执行scan:
返回了所有数据。注意观察HBase返回行的顺序,是按行的名字排序的。HBase称之谓行键(rowkey)。HBase还有很多技巧,但是所有其他东西都建立在你刚才使用的基本概念上。好好体会一下。