第
5
章
HBase简介、部署与开发
本章首先介绍HBase数据库,包括数据模型、系统架构及存储格式。其次
介绍HBase的安装和配置,以及如何使用HBaseShell建表和增加、删除、修改、
查询数据。最后剖析了一个HBaseJava实例。
..5.ae简介

1 
HBs
HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库系统。利用
HBase可在廉价PCServer上搭建大规模结构化数据管理集群。

HBase是一款借鉴GoogleBigtable技术实现的开源软件。Bigtable利用
GFS作为其文件存储系统,HBase则利用HDFS作为其文件存储系统;Bigtable 
利用MapReduce处理Bigtable中的海量数据,HBase则利用HadoopMapReduce处理HBase中的海量数据;Bigtable利用Chubby实现协同服务, 
HBase则利用Zookeper实现同样的功能。

在Hadoop生态系统中,HBase为一款结构化数据管理工具。HDFS为
HBase提供了高可靠性的底层存储支持,HadoopMapReduce为HBase提供了
高性能的计算能力,Zookeper为HBase提供了稳定服务和故障转移(Failover) 
机制。Sqoop则为HBase提供了方便的RDBMS数据导入功能,使得从传统数
据库向HBase迁移变得非常方便。

..5.2 
HBase访问接口

HBase提供了丰富的访问接口。

(1)NativeJavaAPI:是最常用且高效的访问方式,适合MapReduceJob 
并行处理HBase表格的数据。
使用
(
。
2)HBaseShel:是HBase的命令行工具,适合对HBase进行管理时

(3)ThriftGateway:利用Thrift序列化技术,支持C++、PHP 、Python等
多种语言,适合其他异构系统访问HBase表格数据。
(4)RESTGateway:支持REST风格的HTTPAPI访问HBase,解除了


82 
Hadop与Spark入门

语言限制。
(5)Pig:可以使用PigLatin编程语言来操作HBase中的数据(编译成MapReduce 
Job来处理HBase表格的数据),适合做数据统计。
6)Hiv7.va

(e:0.0以上版本的Hie支持HBse,使得用户可以使用类似SQL的查询
语言来访问HBase。
..5.3 
HBase的数据模型

HBase包含如下4个重要概念。
Table:HBase的表格,类似关系数据库的表格,但是有所不同。
RowKey:行键,是Table的主键,Table中的记录按照RowKey排序。
Column和ColumnFamily(列簇或者列分组):Table在垂直方向由一个或者多个

ColumnFamily组成。ColumnFamily可以由任意多个Column组成,即ColumnFamily
支持动态扩展,无须预先定义Column的数量以及类型。所有Column均以二进制格式
存储,用户需要自行进行类型转换。

Timestamp:每次数据操作对应的时间戳,可以看作是数据的版本号(Version 
Number)。
图5-1展示了一个HBase的数据模型实例,该表以反转的URL作为RowKey。


图5-
1 
HBase的数据模型

这个表格有两个ColumnFamily,分别是Contents和Anchor。Contents保存了页面
的内容,每个时间戳对应一个页面,可以保留该页面的不同历史版本;Anchor则保存了指
向这个页面(即引用该页面)的其他页面的锚点(即其他页面的超链接指向本页面)的文本
信息。
tlutaecnicok(.ok.a)

在这个实例中,CNN的主页,被SporsIsrtd(ns.om)和MyLomyloc
两个页面指向,所以每行记录有Anchr:cnicom和Anhr:my.ok.a两列,它们隶

ons.coloc
属于同一个ColumnFamily,即Anchor。
这个表格有两个RowKey,第一个RowKey保留了3个时间戳的Contents列,一个
chcnichmy.ok.

时间戳的Anor:ns.om列,以及另一个时间戳的Ancor:loca列。

当Table的记录数不断增加而变大后,一个Table逐渐分裂(Split)成多个Split,称
为Region。每个Region由[startkey,endkey)或[startkey,endkey]表示,不同的Region 
被Master分配给相应的RegionServer进行管理(存储),如图5-2所示。

HBase中有两张特殊的Table:-ROOT-和.META. 。


第5章HBase简介、部署与开发83
图5-2HBase的Region(1).META.:记录用户表的Region信息,其可以有多个Region。
(2)-ROOT-:记录.META.表的Region信息,其只有一个Region。
Zookeeper中记录了-ROOT-表的位置信息(Location)。Client访问数据之前需要先
访问Zookeeper,再访问-ROOT-表,然后访问.META.表,进而找到用户数据的位置,最后
访问具体的数据。
..5.4HBase系统架构
HBase系统架构如图5-3所示,这是一个典型的主从(Master-Slave)架构,包含
HMaster、HRegionServer和Zookeeper。
图5-
3 
HBase的系统架构

Client:HBaseClient使用HBase的RPC机制与HMaster和HRegionServer进行
通信。对于管理类操作,Client通过RPC访问HMaster;对于数据读写类操作,Client通
过RPC访问HRegionServer。

Zookeper:ZookeperQuorum 存储-ROOT-表的地址和HMaster的地址。
HRegionServer把自己以短暂的(Ephemeral)方式,注册到Zookeper中,使HMaster可


84Hadoop与Spark入门
以随时感知各个HRegionServer的健康状态。引入Zookeeper,避免了HMaster的单点
失败问题。
HMaster:HMaster负责Table和Region的管理工作,具体包括如下内容。
(1)管理用户对Table的增加、删除、修改、查询操作。
(2)管理HRegionServer的负载均衡,调整Region分布。
(3)在Region分裂后,负责分配新的Region。
(4)在HRegionServer停机后,负责失效HRegionServer上的Region的迁移。
HBase可以启动多个HMaster,通过Zookeeper的MasterElection机制,保证总有
一个ActiveMaster运行,所以HMaster没有单点失败问题。
HRegionServer:主要负责响应用户I/O请求,向HDFS读写数据,是HBase中最核
心的模块。每个HRegionServer大约可以管理1000个Region。
图5-4为HRegionServer的内部结构。
图5-
4 
HRegionServer的内部结构

HRegionServer内部管理一系列HRegion对象,每个HRegion对应了Table中的一
个Region。HRegion由多个HStore组成,每个HStore对应了Table中的一个Column 
Family的存储。可以看出,每个ColumnFamily是一个集中的存储单元,因此最好将具
备共同I/O特性的Column放在一个ColumnFamily中,这样可以提高I/O效率。

HStore存储是HBase存储的核心模块,由两部分组成,即MemStore和一系列
StoreFile。MemStore是排序内存缓冲区(SortedMemoryBufer),用户写入的数据首先
会放入MemStore,当MemStore满了以后,写入一个StoreFile(底层实现是HFile)。

当StoreFile数量增长到一定阈值,会触发压缩(Compact)合并操作,将多个
StoreFile合并成一个大的StoreFile,合并过程中会进行版本合并和数据删除。


第5章HBase简介、部署与开发85HBase只能增加数据,所有的更新和删除操作都是在后续的压缩(Compact)过程中
进行的。这使得用户的写操作只要进入内存中就可以立即返回,保证了HBaseI/O的高
性能。当
StoreFile压缩后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一
定阈值后,会触发分裂操作,把当前Region分裂成两个Region,父Region会下线,新分
裂出的两个子Region会被HMaster分配到相应的HRegionServer上,使得原先一个
Region的读写压力得以分流到两个Region上,如图5-5所示。
图5-5HBase压缩/分裂过程
在分布式系统环境中,无法避免系统出错或者宕机。一旦HRegionServer意外退
出,MemStore中的内存数据将会丢失,因此需要引入HLog。
每个HRegionServer都有一个HLog对象,HLog是一个实现预写日志(Write 
AheadLog,WAL)的类。在每次用户操作写入MemStore时,首先写一份数据到HLog
文件中。HLog文件定期删除旧的日志(已持久化到StoreFile中的数据)。

当HRegionServer意外终止后,HMaster会通过
gZookeper感知到这个情况, 
HMaster首先会处理遗留的HLog文件,将其中不同Reion的Log数据进行拆分,分别
放到相应Region的目录下,然后再将失效的Region重新分配。领取到这些Region的
HRegionServer,在装载Region的过程中,会发现有历史HLog需要处理,因此会重放
HLog(应用日志记录)中的数据到MemStore中,然后写入StoreFile中,完成数据恢复。

..5.5 
HBase存储格式

HBase的所有数据文件都存储在HadoopHDFS上,包括两种文件类型。

(1)HFile:Hadoop的二进制格式文件,实现HBase中KeyValue数据的存储。
StoreFile是对HFile做了轻量级包装,即StoreFile底层就是HFile。

(2)HLogFile:在HBase中实现WAL(WriteAheadLog)的存储格式,本质上是
HadoopSequenceFile。

HFile的存储格式如图5-6所示。

HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。Trailer 
中有指针指向其他数据块的起始点。FileInfo中记录了文件的一些元信息,如AVG_ 
KEY_LEN 、AVG_VALUE_LEN 、LAST_KEY 、COMPARATOR 、MAX_SEQ_ID_KEY 
等。DataIndex和MetaIndex块记录了每个Data块和Meta块的起始点。因此,HFile 


86Hadoop与Spark入门
图5-6HFile的存储格式
形成了一种自描述的文件结构。
Data块是HBaseI/O的基本单元。为了提高效率,HRegionServer中实现了基于最
近最少使用(LeastRecentlyUsed,LRU)的BlockCache机制。每个Data块的大小可以
在创建一个Table时通过参数指定,较大的块有利于顺序扫描,较小的块有利于随机
查询。每
个Data块除了开头的Magic信息以外,就是由一个个<Key,Value>拼接而成
的。Magic的内容是一些随机数字,目的是防止数据损坏。
HFile里面的每个<Key,Value>都是一个简单的字节(Byte)数组,但是字节数组里
面包含了很多项,并且有固定的结构。

如图5-7所示,字节数组开始是两个固定长度的数值,分别表示Key的长度和Value 
的长度。然后是Key部分具体项目排序如下:①固定长度的数值,表示RowKey的长
度;②RowKey;③固定长度的数值,表示ColumnFamily的长度;④ColumnFamily(见
图5-1中的AncooumnQulfer(见图5-1中的cnscom或者my.ok.a);

hr);⑤Claiiniloc

⑥两个固定长度的数值,表示Timestamp和KeyType(Put/Dele)。最后Value部分结
构简单,就是纯粹的二进制数据。te(.) 
图5-
7 
字节数组

HLogFile的存储格式如图5-8所示。

HLog文件就是一个普通的HadoopSequenceFile。HLogSequenceFile的Key是
HLogKey对象,HLogKey中记录了写入数据的归属信息,除了Table和Region名字外, 
同时还包括SequenceNumber和Timestamp。Timestamp是写入时间,Sequence 
Number的起始值为0,或者是最近一次存入文件系统的SequenceNumber。HLogSequenceFile的Value是HBase的<Key,Value>对象,即对应HFile中的Key和
Value。


第5章HBase简介、部署与开发87
图5-8HLogFile的存储格式
..5.6在HBase系统上运行MapReduce
可以在HBase系统上运行MapReduce作业,如图5-9所示,实现数据的批处理。
图5-
9 
在HBase系统上运行MapReduce的原理

HBaseTable和Region的关系,类似于HDFSFile和Block的关系。HBase提供了
配套的TableInputFormatAPI 和TableOutputFormatAPI,可以方便地将HBaseTable 
作为HadoopMapReduce的数据源(Source)和目的地(Sink)。对于MapReduce作业的
应用开发人员,不需要关注HBase系统的细节。

..5.7 
HBase安装、配置与运行

下面介绍如何安装、配置和运行HBase数据库。

配置192.129 、130 、131 虚拟机的//hs文件。增

168.31.192.31.168.ecs

168.192.31.tot


88 Hadoop与Spark入门
加如下内容: 
127.0.0.1 localhost 
从官方网址下载HBase安装包hbase-1.2.5-bin.tar.gz。
解压缩后,对目录进行重新命名。 
cd /opt/linuxsir 
tar xzvf hbase-1.2.5-bin.tar.gz 
ls hbase-1.2.5 
mv hbase-1.2.5 /opt/linuxsir/hbase 
HBase 可以以独立(Standalone)、伪分布式(Pseudo-Distributed)、分布式
(Distributed)3种模式进行部署,这里只介绍分布式模式。
修改/opt/linuxsir/hbase/conf目录下的hbase-env.sh脚本文件。设置JAVA_HOME的
环境变量,以便启动HBase。 
export JAVA_HOME=/opt/linuxsir/java/jdk 
export HBASE_CLASSPATH=/opt/linuxsir/hadoop/etc/hadoop 
export HBASE_MANAGES_ZK=true 
注意: 
(1)HBASE_CLASSPATH 环境变量的设置,使得HBase和Hadoop的配置文件相
连。也就是把Hadoop配置文件所在目录加入HBASE_CLASSPATH 环境变量,使
HBase看到HDFS的配置信息。
(2)如果想使用外部的Zookeeper,那么HBASE_MANAGES_ZK应该设置为false。
修改当前用户目录下的~/.bashrc文件,并使之生效。 
echo "">>~/.bashrc 
echo "export HBASE_HOME=/opt/linuxsir/hbase">>~/.bashrc 
echo "export PATH=\$HBASE_HOME/bin:\$PATH">>~/.bashrc 
echo "export CLASSPATH=\$CLASSPATH:/opt/linuxsir/hbase/lib/*">>~/.bashrc 
cat ~/.bashrc 
source ~/.bashrc 
执行如下命令,建立一些目录,包括tmp/zookeeper等。 
mkdir /opt/linuxsir/hbase/tmp

第5章 HBase简介、部署与开发 89 
ls /opt/linuxsir/hbase/zookeeper 
//没有该目录就创建
mkdir /opt/linuxsir/hbase/zookeeper 
有任何错误,可以先把tmp和zookeeper目录删除后再尝试。 
rm -rf /opt/linuxsir/hbase/tmp 
rm -rf /opt/linuxsir/hbase/zookeeper 
编辑HBase配置文件,即/opt/linuxsir/hbase/conf目录下的hbase-site.xml,内容
如下: 
<? xml version="1.0"? > 
<? xml-stylesheet type="text/xsl" href="configuration.xsl"? > 
<configuration> 
<property> 
<name> hbase.rootdir</name> <!- - 用户无需手动创建HBase 的data 目录,HBase 
启动的时候会自动创建--> 
<value>hdfs://hd-master:9000/hbase</value> 
</property> 
<property> 
<name>hbase.zookeeper.property.dataDir</name> 
<value>/opt/linuxsir/hbase/zookeeper</value> 
</property> 
<property> 
<name>hbase.cluster.distributed</name> 
<value>true</value> 
</property> 
<property> 
<name>hbase.zookeeper.quorum</name> 
<value>hd-master,hd-slave1,hd-slave2</value> 
</property> 
<property> 
<name>hbase.zookeeper.property.dataDir</name> 
<value>/opt/linuxsir/hbase/zookeeper</value> 
</property> 
<property> 
<name>hbase.zookeeper.property.clientPort</name>

90 Hadoop与Spark入门 
<value>12181</value> 
</property> 
</configuration> 
在分布式模式下,HBase 集群包含若干节点,运行主HMaster 进程、Backup 
HMaster进程、Zookeeper进程及HRegionServer进程等。
本书采用如下部署规划,注意Zookeeper进程的部署已经在hbase-site.xml文件中
设置。
(1)HMaster进程,运行在hd-master、hd-slave1(backup)上。
(2)Zookeeper进程,运行在hd-master、hd-slave1、hd-slave2上。
(3)HRegionServer进程,运行在hd-slave1、hd-slave2上。
编辑/opt/linuxsir/hbase/conf目录下的regionservers文件,内容如下: 
hd-slave1 
hd-slave2 
编辑/opt/linuxsir/hbase/conf目录下的backup-masters文件,内容如下: 
hd-slave1 
注意:这里没有关于HMaster的部署位置的配置。当在hd-master上启动HBase 
时,hd-master节点将运行HMaster进程。
.. 5.8 启动HBase并且测试
从hd-master复制/opt/linuxsir/hbase目录以及~/.bashrc文件到hd-slave1和hdslave2,
并且在3个节点上使~/.bashrc文件生效。 
clear 
scp -r /opt/linuxsir/hbase hd-slave1:/opt/linuxsir 
scp -r /opt/linuxsir/hbase hd-slave2:/opt/linuxsir 
scp ~/.bashrc hd-slave1:~/.bashrc 
scp ~/.bashrc hd-slave2:~/.bashrc 
source ~/.bashrc 
ssh root@192.168.31.130 source ~/.bashrc 
ssh root@192.168.31.131 source ~/.bashrc 
启动HBase前,需要先启动Hadoop。
首先,清空日志目录,以便启动出错时,方便查看最新出错信息。