1. 前言
HBase
是一个分布式
的、面向列
的开源数据库。HBase
是Apache
的Hadoop
项目的子项目。HBase
不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase
基于列的而不是基于行的模式。
1.1 HBase
表的特点
大
:一个表可以有有数以十亿行,上百万列面向列
:面向列(族)的存储和权限访问,列(族)独立索引稀疏
:对于未空(null)的列,并不占用存储空间,因此表可以设计的非常稀疏数据类型单一
:HBase中的数据类型都是字符串
(string)无模式
:每行都有一个可排序的主键和任意多的列,列可以根据需要动态增加,同一张表中不同的行可以截然不同的列
1.2 HBase
和关系数据库区别
数据库类型
:HBase中的数据类型都是字符串类型
(string)数据操作
:HBase只有普通的增删改查等操作,没有表之间的关联查询存储模式
:HBase是基于列式存储模式,而RDBMS是基于行式存储的应用场景
:HBase适合存储大量数据,查询效率极高
2. 基本概念
HBase
以表的形式存储数据。表有行和列组成。列划分为若干个列族(column family
)
2.1 RowKey
用来检索记录的主键 主键为任意字符串,最大长度为64kb
,按字典顺序存储,在HBase内部保存为字节数组。
Rowkey
是以字典顺序排序的, Rowkey
尽量散列设计,保证所有的数据不是在一个Region
上,从而避免读写的时候负载会集中在个别Region
上。 Rowkey
的长度尽量短,如果太长存储开销会增加,影响存储效率,Rowkey
字段过长,会导致内存的利用率降低,进而降低索引的命中率。
常见Rowkey
设计方法:
- 反转userId,将userId字符串反转后存储
- 散列userId,对userId进行散列
- userId取模后进行MD5,区前6位作为前缀加入到userId前面
- 时间使用long型来表示
- 尽量使用编码压缩
访问HBase
表中的行,只有三种方式:
- 通过
rowkey
- 通过
rowkey
的range
- 全表扫描
2.2 列族(Column Family
)
列族在创建表的时候声明,一个列族可以包含多个列,列中的数据都是以二进制形式存在,没有数据类型,列族是一些列的集合 一个列族所有成员是有着相同的前缀。用”:
”来分割列族和列名
2.3 列(Column
)
属于某一个column family
,columnfamily:columnName
,每条记录可动态添加。
2.4 时间戳和存储单元(TimeStamp
and Cell
)
HBase
中通过row
和columns
确定的唯一个存储单元成为cell
,每个cell
都保存同一份数据的多个版本 在写入数据时,时间戳可以由HBase
自动赋值(当前系统时间精确到毫秒),也阔以显示赋值 每个cell
中,不同版本的数据按照时间的倒叙排序 {row,Column,version}
元组就是HBase
中的一个cell
3. HBase物理模型
HBase
存储细节 每个列族存储在HDFS
上的一个单独文件夹中 Key
和Version number
会在每个列族中存储一份 空值不会被保存 HBase
为每个值维护了多级索引,即:
物理存储:
- Table中所有行都按照
row key
的字典序排列; - Table在行的方向上分割为多个
Region
; Region
按大小分割的,每个表开始只有一个region
,随着数据增多,region
不断增大,当增大到一个阀值的时候,region
就会等分会两个新的region
,之后会有越来越多的region
;- Region是Hbase中分布式存储和负载均衡的最小单元,不同Region分布到不同RegionServer上。
- Region虽然是分布式存储的最小单元,但并不是存储的最小单元。Region由一个或者多个Store组成,每个store保存一个columns family;每个Strore又由一个memStore和0至多个StoreFile组成,StoreFile包含HFile;memStore存储在内存中,StoreFile存储在HDFS上。
4. HBase架构与基本组件
Client
整个HBase集群的入口 使用HBase RPC机制与HMaster和HRegionServer通信 与HMaster通信进行管理类的操作 与HRegionServer通信进行读写类操作 包含访问HBase的接口,并维护cache来加快对HBase的访问,与HRegionServer交互
ZooKeeper
程序协调服务
保证任何时候,集群中只有一个Master(HA) 存储所有Region的寻址入口 实时监控Region server的上线和下线信息。并实时通知HMaster 存储HBase的schema和table元数据
HBase
主节点HMaster
管理用户对Table的增删改查操作(表操作) 管理HRegionServer的负载均衡,调整Region分布 在Region split后,负责新Region的分配 在HRegionServer停机后,负责将失效的HRegionServer上的Region迁移 HMaster失效仅会导致所有元数据无法被修改,但是表的数据读写还是可以正常进行
HRegionServer
节点
维护HRegion并往HDFS中写数据 当表的大小超过设置值时,split HRegion 在HRegionServer停机后,负责失效HRegionServer上的HRegion迁移
HBase
与Zookeeper
HBase元数据存储在Zookeeper中 默认情况下,HBase管理Zookeeper实例,比如,启动或者停止Zookeeper Zookeeper解决HBase单点故障问题 HMaster与HRegionServer启动时会向Zookeeper注册
WAL
WAL是Regionserver在处理插入和删除的过程中用来记录操作内容的一种日志
一个表由一个region或者多个region组成,region由regionserver进行管理 每个region包含memstore和storeFile,memstore存储在内存中,storeFile存储在磁盘中
HBase在HDFS中存储
/hbase/.tmp
:临时目录,当对表做创建和删除的时候,会将表move到该目录,然后进行操作/hbase/data
:核心目录,存储HBase表的数据 默认情况下,目录下有两个目录/hbase/data/default
: 在用户创建表的时候,没有指定namespace时,表就创建在此目录下/hbase/data/hbase
:系统内部创建的表,.META.表(region的详细信息)和namespace表(namespace信息)/hbase/hbase.id
:存储的是集群的唯一cluster id(uuid)/hbase/hbase.version
:集群的版本号/hbase/oldWALs
: 对应0.94.x版本中.oldlogs目录 当/hbase/WALs目录中的logs没有之后,会将这些logs移动到此目录下,HMaster会定期清理
HBase使用场景
- 大数据量存储,大数据量高并发操作
- 需要对数据随机读写操作
- 读写访问均是非常简单的操作
HBase与HDFS对比
- 两者都具有良好的容错性和扩展性,都可以扩展到成百上千个节点;
- HDFS适合批处理场景,不支持数据随机查找,不适合增量数据处理,不支持数据更新