# Hbase
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
HBase是一个分布式的、面向列的开源数据库,该技术来源于Chang et al所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。
HBase存储的是松散型数据,是一个适合于非结构化数据存储的数据库,另一个不同的是HBase基于列的而不是基于行的模式。
### 一. HBase逻辑模型
表是HBase的基本管理单元,在hbase中会设计多个表存放不同的数据和bigtable还是有区别的,bigtable是一个表
表由行与列组成,每个列属于某个列族,由行和列确定的存储单元称为元素。
表按Row排序的。
每个元素保存了同一份数据的多个版本,由时间戳来标识区分。
元素以字节码形式存放,没有类型之分。
#### 1 行键
可以想象成关系数据库中的主键。可能是多行,因为有时间戳。
行键是数据行在表里的唯一标识,并作为检索记录的主键
访问表里的行有三种方式:单个行键访问、给定行键的范围访问、全表扫描
行键可以是最大长度不超过64KB的任意字符串
按照字典序存储。对于经常要一起读取的行,要对行键值精心设计,以便它们能放在一起存储,保证连续性,当进行范围扫描时更快。
#### 2 列族与列
HBase表中的每个列都归属于某个列族。
- 列族必须作为表模式(schema)定义的一部分预先给出。
- 列族是固定的(在设计hbase表时,需要设计几个列族必须定好),但列是动态的(每个“列族”都可以有多个列成员(column),定义的时候不知道有多少个列、列名是什么)
列表示为<列族>:<限定符>,以列族作为前缀,以限定符的形式指定特定的列成员。
插入数据的时候可以动态更改列的数量。
- Hbase在磁盘上按照列族存储数据,把同一列族里面的数据存储在同一目录下,由几个文件保存。
列式数据库适合的数据分析的情形:针对几个列的多行数据进行扫描分析;单独对某几个列多行的数据进行收集扫描。
- 元素:由行和列确定的存储单元称为元素。每一个元素在Hbase中的结构如下图所示,类似于通信协议中的概念:
![](https://box.kancloud.cn/982fd3548cd11b50efa07b2836f354e8_554x97.png)
首先是行键:key的长度和value的长度
然后是列族:行长度 行 列族长度 列族 限定符 时间戳 key类型
= 时间戳
- hdfs中,不方便插入修改,所以这里有了时间戳的概念。每次都是用新的数据加入。
- 删除也是插入一条新的记录,然后加以标记,总而言之都是插入数据。
#### 3 时间戳
元素由:行键,列族:限定符,时间戳唯一决定。时间戳就是version,用来表示行键与列族对应的列值的版本。
时间戳是64位整型(一般用系统时间,精确到毫秒),对应每次数据操作的时间,可由系统自动生成,也可以由用户显式的赋值
### 二. HBase物理存储
HBase是按照列存储的稀疏行/列矩阵。
稀疏:在多个列族存在的情况下,只有其中的一个列族有数据就是稀疏。为什么稀疏能提高性能?
- Hbase是列存储,在hbase中是以列族为单位将数据存储在存储单元中的。
- 如果数据稀疏,也就意味着查询的时候只会查到某一个单元的数据。
- 如果不是稀疏,当同一个行键同一个时间戳查询的时候,同一个列族的数据会有多个。这种情况就会访问不同的存储单元,效率就会降低。
逻辑结构->物理存储结构
![](https://box.kancloud.cn/d512967cad19ba50eb5b6856dce2cfeb_554x243.png)
![](https://box.kancloud.cn/049222384753a3ad8f99718b9a2ff723_554x230.png)
在物理存储模型中,并不是几个列族就有几个列,而是所有列族都在一个列。这样行数就会增加,列数就三列。
1 Table中的所有行都按照row key的字典序排列。
2 Table 在行的方向上分割为多个Hregion。
3 region按大小分割的,每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,Hregion就会等分会两个新的Hregion。当table中的行不断增多,就会有越来越多的Hregion。
4 HRegion是Hbase中分布式存储和负载均衡的最小单元。最小单元就表示不同的Hregion可以分布在不同的HRegion server上。但一个Hregion是不会拆分到多个server上的。
5 HRegion虽然是分布式存储的最小单元,但并不是存储的最小单元。事实上,HRegion由一个或者多个Store组成,每个store保存一个columns family,每个Strore又由一个memStore和0至多个StoreFile组成,StoreFile以HFile格式保存在HDFS上。
### 三. HBase物理模型
![](https://box.kancloud.cn/bec5dc66b754d0e906f98416b0b28662_554x357.png)
这个架构也类似于hadoop本身的架构,由master和namenode存储元数据,真正的数据存储在datanode上(会有多个datanode)。
- Hmaster负责元数据存储,维护整个hbase集群的状态。
- HRegionServer是真正管理数据的增删改查,用户提交的数据请求都是通过HRegionServer协调处理。
每一个物理机器节点只能有一个HRegionServer。
在HRegionServer下管理HRegion。
- HRegion中存放的真正存储单元。
HRegion就是我们创建表的时候创建的,在默认情况下建立的表都有一个HRegion。
HRegion到底交个哪个HRegionServer管理,是由Hmaster管理,它会考虑负载均衡和资源管理。
HRegion中有一系列的结构。
- HLog (hbase log)日志记录文件。相当于oracle中的重做日志文件;Redo log记录增删改查的每一笔记录。
- Store单元存放真实的数据放。
数据以列族为单位存放,列族就存放在store中。
Store又分为两个部分:MemStore内存存储;StoreFile 存储文件,是以HFile存在的,存在于hdfs系统中datanode上。
- 在HRegionServer中 HRegion会有多个,随着数据不断增加就会产生新的HRegion,hlog只有一个。
- 在hadoop中,存储是均匀的,hbase的hfile就会分布在datanode上。整体上数据进行了两次分布。在hbase和hadoop上进行两次分布。
Region和Region服务器
表在行方向上,按照行键范围划分成若干的Region
表的存储模型关键的就是行键。比如有一亿条数据,每一个region是一千万,那么有10个regions(1-1000万 1000-2000万 。。。这么划分)
每个表最初只有一个region,当记录数增加到超过某个阈值时,开始分裂成两个region
物理上所有数据存放在HDFS,由Region服务器提供region的管理
如果有一个hregionServer宕机或下线,Hmaster会将Hregion交给其他Hregionserver管理
一台物理节点只能跑一个HRegionServer
一个Hregionserver可以管理多个Region实例
一个Region实例包括Hlog日志和存放数据的Store
Hmaster作为总控节点
Zookeeper负责调度
HLog
用于灾难恢复
预写式日志(WAL),记录所有更新操作,操作先记录进日志,数据才会写入
每个Region服务器只维护一个Hlog,来自不同表的Region日志是混合在一起的
Hlog会被定期回滚
Store
每个Region由一个或多个Store组成,每个Store保存一个列族的所有数据
每个Store由一个memStore和零个或多个StoreFile组成
StoreFile以Hfile的格式存储在HDFS上的,这些文件都是B树结构
![](https://box.kancloud.cn/3270d2af7622d4320dcfbef234605f70_552x269.png)
客户端更新操作流程
先连接有关的HRegionServer,然后向Region提交变更
提交的数据首先写入WAL(Write-Ahead Log)和MemStore
当memstore中的数据量达到某个阈值,Hregionserver会启动flashcache进程写入StoreFile
当StoreFile文件的数量增长到一定阈值后,系统会将多个StoreFile进行合并,在合并过程中会进行版本合并和删除工作,形成更大的StoreFile
当单个StoreFile大小超过一定阈值后,会把当前的Region分割为两个Regions,并由Hmaster分配到相应的Region服务器,实现负载均衡
客户端检索数据时,先在MemStore找,找不到再找StoreFile
HMaster
HBase只有一个HMaster(主服务器程序)
HMaster将Region分配给Region服务器,协调Region服务器的负载并维护集群的状态
HMaster不会对外(Region服务器和客户端)提供数据服务,而是由Region服务器负责所有Regions的读写请求及操作
如果HRegionServer发生故障终止后,HMaster会通过ZooKeeper感知到,并处理相应的Log文件,然后重新分配失效的Regions
HMaster还负责管理表的schema和对元数据的操作
HMaster失效仅会导致所有元数据无法被修改,但表的数据读写还是可以正常进行