最近由于工作关系,需要了解HBase,随手记录一些内容,以供查阅。

NoSQL

在刚接触Hadoop的时候,对Hive和HBase这两个组件总是不算特别清楚,都跟数据库有点关系,Hive又跟HBase有依赖,扯不太清楚。 如果要简单的说二者的区别,可以这样理解:可以把Hive理解为一个SQL Parser,其目的是为了方便那些会使用SQL编程的数据科学家们,但真正在跑的,是Hive翻译出来的Map Reduce程序。所以Hive的用处仍然是离线批量计算。 而HBase本质上是一个NoSQL数据库。那么问题来了,NoSQL又是什么鬼?说白了,NoSQL(Not Only SQL)也是一种数据库;但它区别于Oracle、MySQL这种会提供一个便捷的SQL编程语言的关系型数据库。NoSQL通常是列式数据库,不支持事务,不提供行的修改,其访问接口与SQL完全不同,例如HBase的接口是这样的:

hbase(main):001:0> create 'test', 'cf'
0 row(s) in 0.4170 seconds

=> Hbase::Table - test
hbase(main):002:0> list 'test'
TABLE
test
1 row(s) in 0.0180 seconds

=> ["test"]

显然这与SQL是不兼容的。当然了,这样做是不是合适也见仁见智。与SQL不兼容,必然造成用户原有业务系统不能方便的迁移到HBase上来,需要做较多的改造。但话说回来,由于NoSQL不能完整支持RDBMS的众多方便的功能,与其削足适履,不如干脆重开一片新天地。 如果您的业务想在HBase基础上开发一款新产品,可能做一套方便的SQL接口是个不错的方法。

HBase

从技术上来说,HBase应该叫做分布式“数仓”(Data Store),而不是数据库,因为它没有数据库的各种特点,例如列的类型,二级索引,触发器等。 HBase的特点如下:

  • 支持读写一致性。 这跟一些NoSQL数据库不太一样。
  • 自动碎片化。HBase通过region实现分布式,region自动分片,并且随着数据的增长,会自动重新分布式。
  • Region Server支持故障恢复
  • 集成HDFS,因此也就拥有了超大的存储空间
  • 支持MR大数据量并发处理的源或目的
  • 提供JAVA API(再也不用写Hibernate了)
  • 对于非JAVA程序,HBase也提供Thrift/REST API
  • 支持块存储和Bloom Filters
  • 内置WEB化管理界面(呵呵)

快速开始

我们先在本地stand alone的状态启动一个HBase的环境(没有集成HDFS,只是体验用)。官方说明,只要10分钟就能搞定。这个例子会帮助我们对HBase有个比较感性的认识。

1、 JDK 由于版权的问题,以后我们都会只用openjdk。如下分别安装JRE和JDK。

# yum install java-1.8.0-openjdk
# yum install java-1.8.0-openjdk-devel

2、 去官网或者镜像下载stable bin,解压。

3、 从 0.98.5 开始要求设置JAVA_HOME环境变量。 有两种做法: 一是设置全局的JAVA_HOME,这样所有的hadoop组件都可以得到满足,但是如果你想支持多套JDK环境就没法应付了。 二是在hbase_env.sh中单独设置本组件的JAVA_HOME,精细化管理。我们采用的是这个做法。编辑./conf/hbase_env.sh文件:

# The java implementation to use.  Java 1.7+ required.
export JAVA_HOME=/usr/

如果你的环境跟我不一样也没关系,只是要注意从上面给出的路径直接走到./bin可以找到javac。

4、 设置hbase的使用的目录。 还记得我们是standalone模式安装吗?这种情况实际我们数据是存储在本地的某个目录的(对应集群则存储在HDFS)。在conf/hbase-site.xml中新增如下:

<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>file:///home/testuser/hbase</value>
  </property>
  <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/home/testuser/zookeeper</value>
  </property>
</configuration>

hbase和zookeper两个目录不需要创建。

5、 启动HBase服务 HBase提供了脚本bin/start-hbase.sh ,可以方便的启动HBase服务。启动成功后,如果你输入jps,只会看到一个HMaster的进程。

# jps
3030 Jps
1997 HMaster

standalone模式里,HBase在一个JVM中运行了HMaster、Region Server、zookeeper三个角色。

6、 进入到HBase shell交互界面:

# ./bin/hbase shell
2015-09-15 02:08:38,364 WARN  [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.1.2, rcc2b70cf03e3378800661ec5cab11eb43fafe0fc, Wed Aug 26 20:11:27 PDT 2015

hbase(main):001:0> 

在这儿你可以创建表、插入数据、查询数据等,官方网站上有,我直接搬运过来好了。唯一需要注意的是这个例子用了列族(就是cf:a, cf:b, cf:c,下一篇文章再谈)等。

hbase(main):001:0> create 'test', 'cf'
hbase(main):002:0> list 'test'
TABLE
test
1 row(s) in 0.0180 seconds

=> ["test"]
hbase(main):003:0> put 'test', 'row1', 'cf:a', 'value1'
0 row(s) in 0.0850 seconds
hbase(main):004:0> put 'test', 'row2', 'cf:b', 'value2'
0 row(s) in 0.0110 seconds
hbase(main):005:0> put 'test', 'row3', 'cf:c', 'value3'
0 row(s) in 0.0100 seconds
hbase(main):006:0> scan 'test'
ROW                                      COLUMN+CELL
 row1                                    column=cf:a, timestamp=1421762485768, value=value1
 row2                                    column=cf:b, timestamp=1421762491785, value=value2
 row3                                    column=cf:c, timestamp=1421762496210, value=value3
3 row(s) in 0.0230 seconds
hbase(main):007:0> get 'test', 'row1'
COLUMN                                   CELL
 cf:a                                    timestamp=1421762485768, value=value1
1 row(s) in 0.0350 seconds
hbase(main):008:0> disable 'test'
0 row(s) in 1.1820 seconds
hbase(main):011:0> drop 'test'
0 row(s) in 0.1370 seconds

HBase 官方链接