第四章 分布式数据库HBase
概述
从BigTable说起
1 | BigTable是一个分布式存储系统 |
1 | •建立互联网索引 |

1 | •BigTable是一个分布式存储系统 |
HBase简介
1 | HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌BigTable的开源实现,主要用来存储非结构化和半结构化的松散数据。HBase的目标是处理非常庞大的表,可以通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表 |
1 | 关系数据库已经流行很多年,并且Hadoop已经有了HDFS和MapReduce,为什么需要HBase? |
HBase与传统关系数据库的对比分析
1 | • HBase与传统的关系数据库的区别主要体现在以下几个方面: |
HBase访问接口

HBase数据模型
数据模型概述
1 | • HBase是一个稀疏、多维度、排序的映射表,这张表的索引是行键、列族、列限定符和时间戳 |
数据模型相关概念
1 | • 表:HBase采用表来组织数据,表由行和列组成,列划分为若干个列族 |
数据坐标
1 | • HBase中需要根据行键、列族、列限定符和时间戳来确定一个单元格,因此 |
概念视图
1 | 这里能看出hbase是稀疏表 |
物理视图
面向列的存储

1 | 列式存储适用于分析,如只分析年龄、性别 |
HBase的实现原理
HBase功能组件
1 | HBase的实现包括三个主要的功能组件: |
1 | • 主服务器Master负责管理和维护HBase表的分区信息,维护Region服务器列表,分配Region,负载均衡 |
表和Region
1 | •开始只有一个Region,后来不断分裂 |
1 | •每个Region默认大小是100MB到200MB(2006年以前的硬件配置) |

Region的定位
1 | •元数据表,又名.META.表,存储了Region和Region服务器的映射关系 |

1 | •为了加快访问速度,.META.表的全部Region都会被保存在内存中 |
1 | 客户端访问数据时的“三级寻址” |
HBase运行机制
HBase系统架构
1 | 1. 客户端 |
1 | 3. Master |
Region服务器工作原理
用户读写数据过程
1 | •用户写入数据时,被分配到相应Region服务器去执行 |
缓存的刷新
1 | •系统会周期性地把MemStore缓存里的内容刷写到磁盘的StoreFile文件中,清空缓存,并在Hlog里面写入一个标记 |
StoreFile 的合并
1 | •每次刷写都生成一个新的StoreFile,数量太多,影响查找速度 |
Store工作原理
1 | •Store是Region服务器的核心 |
1 | 这就是上面region的分裂 |
HLog工作原理
1 | • 分布式环境必须要考虑系统出错。HBase采用HLog保证系统恢复 |
HBase应用方案
HBase实际应用中的性能优化方法
行键
1 | 行键是按照字典序存储,因此,设计行键时,要充分利用这个排序特点,将经常一起读取的数据存储到一块,将最近可能会被访问的数据放在一块。 |
InMemory
1 | 创建表的时候,可以通过HColumnDescriptor.setInMemory(true)将表放到 |
Max Version
1 | 创建表的时候,可以通过HColumnDescriptor.setMaxVersions(int maxVersions)设置表中数据的最大版本,如果只需要保存最新版本的数据,那么可以设置setMaxVersions(1)。 |
Time To Live
1 | •Time To Live |
HBase性能监视
Master-status(自带)
1 | •HBase Master默认基于Web的UI |
Ganglia
1 | Ganglia是UC Berkeley发起的一个开源集群监视项目,用于监控系统性能 |
OpenTSDB
1 | OpenTSDB可以从大规模的集群(包括集群中的网络设备、操作系统、应用程序) |
Ambari
1 | Ambari 的作用就是创建、管理、监视 Hadoop 的集群 |
在HBase之上构建SQL引擎
1 | NoSQL区别于关系型数据库的一点就是NoSQL不使用SQL作为查询语言, |
Hive整合HBase
1 | Hive与HBase的整合功能从Hive0.6.0版本已经开始出现,利用两者对外的API接口互相通信,通信主要依靠hive_hbase-handler.jar工具包(Hive Storage Handlers)。由于HBase有一次比较大的版本变动,所以并不是每个版本的Hive都能和现有的HBase版本进行整合,所以在使用过程中特别注意的就是两者版本的一致性。 |
Phoenix
1 | Phoenix由Salesforce.com开源,是构建在Apache HBase之上的一个SQL中间层,可以让开发者在HBase上执行SQL查询。 |
构建HBase二级索引
1 | HBase只有一个针对行健的索引 |
1 | •Coprocessor构建二级索引 |
Hindex二级索引
1 | Hindex 是华为公司开发的纯 Java 编写的HBase二级索引,兼容 Apache HBase 0.94.8。当前的特性如下: |
HBase+Redis
1 | •Redis+HBase方案 |
Solr+HBase
1 | Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其 |
HBase编程实践
HBase的安装与配置
HBase安装
1 | •下载安装包hbase-1.1.2-bin.tar.gz |
HBase配置
1 | HBase有三种运行模式,单机模式、伪分布式模式、分布式模式。 |
HBase常用Shell命令
create、list
1 | •create:创建表 |
put、scan
1 | put:向表、行、列指定的单元格添加数据 |
1 | 例子2:继续向表tempTable中的第r1行、第“f1:c1”列,添加数据值为“hello,dblab” |
get
1 | get:通过表名、行、列、时间戳、时间范围和版本号来获得相应单元格的值 |
1 | 例子3: |
1 | 从运行结果可以看出: tempTable中第r1行、第“f1:c3”列的值当前不存在 |
enable/disable:使表有效或无效
1 | 删除之前,要使之无效 |
drop:删除表
HBase常用Java API及应用实例
1 | HBase是Java编写的,它的原生的API也是Java开发的,不过,可以使用Java或其他语言调用API来访问HBase |
1 | 任务要求:创建表、插入数据、浏览数据 |

每次都建立和关闭连接
1 | import org.apache.hadoop.conf.Configuration; |
所有操作只建立和关闭一次连接
建立连接
1 | //建立连接 |
1 | 拷贝这个文件到工程目录也行,就不用写配置路径信息 |
关闭连接
1 | //关闭连接 |
创建表
1 | ①创建表 |
1 | /*创建表*/ |
添加数据
1 | ②添加数据 |
1 | /*添加数据*/ |
1 | 添加数据时,需要分别设置参数myTableName、rowkey、colFamily、col、val的 |
浏览数据
1 | /*获取某单元格数据*/ |
1 | 比如,现在要获取姓名为“zhangsan”在“English”上的数据,就可以在运行上述代码时,指定参数tableName为“student”、rowKey为“zhangsan”、colFamily为“score”、col为“English”。 |