hbase 模型
[官方文档]http://hbase.apache.org/book.html#regions.arch
[模型论文]http://0b4af6cdc2f0c5998459-c0245c5c937c5dedcca3f1764ecc9b2f.r43.cf2.rackcdn.com/9353-login1210_khurana.pdf
大数据量存储,大数据量高并发操作
需要对数据随机读写操作
读写访问均是非常简单的操作
1.HBase数据模型术语
Table(表格)
一个HBase表格由多行组成。
Row(行)
HBase中的行里面包含一个key和一个或者多个包含值的列。行按照行的key字母顺序存储在表格中。因为这个原因,行的key的设计就显得非常重要。数据的存储目标是相近的数据存储到一起。一个常用的行的key的格式是网站域名。如果你的行的key是域名,你应该将域名进行反转(org.apache.www, org.apache.mail, org.apache.jira)再存储。这样的话,所有Apache域名将会存储在一起,好过基于子域名的首字母分散在各处。
Column(列)
HBase中的列包含用:分隔开的列族和列的限定符。
Column Family(列族)
因为性能的原因,列族物理上包含一组列和它们的值。每一个列族拥有一系列的存储属性
,例如值是否缓存在内存中,数据是否要压缩或者他的行key是否要加密等等。表格中的每一行拥有相同的列族,尽管一个给定的行可能没有存储任何数据在一个给定的列族中。
Column Qualifier(列的限定符)
列的限定符是列族中数据的索引。例如给定了一个列族content,那么限定符可能是content:html,也可以是content:pdf。列族在创建表格时是确定的了,但是列的限定符是动态地并且行与行之间的差别也可能是非常大的。
Cell(单元)
单元是由行
、列族
、列限定符
、值
和代表值版本的时间戳
组成的。
Timestamp(时间戳)
时间戳是写在值旁边的一个用于区分值的版本的数据。默认情况下,时间戳表示的是当数据写入时RegionSever的时间点,但你也可以在写入数据时指定一个不同的时间戳。
2.概念视图
一个名为webable的表格,表格中有两行(com.cnn.www 和 com.example.www)和三个列族(contents, anchor, 和 people)。在这个例子当中,第一行(com.cnn.www)中anchor包含两列(anchor:cssnsi.com, anchor:my.look.ca)和content包含一列(contents:html)。这个例子中com.cnn.www拥有5个版本而com.example.www有一个版本。contents:html列中包含给定网页的整个HTML。anchor限定符包含能够表示行的站点以及链接中文本。People列族表示跟站点有关的人。
在HBase中,表格中的单元如果是空将不占用空间或者事实上不存在。这就使得HBase看起来“稀疏”。
下面的方式以多维度映射的方式来表达相同的信息。下面只是一个用于说明目的的模型可能不是百分百的精确。
{
"com.cnn.www": {
contents: {
t6: contents:html: "<html>..."
t5: contents:html: "<html>..."
t3: contents:html: "<html>..."
}
anchor: {
t9: anchor:cnnsi.com = "CNN"
t8: anchor:my.look.ca = "CNN.com"
}
people: {}
}
"com.example.www": {
contents: {
t5: contents:html: "<html>..."
}
anchor: {}
people: {
t5: people:author: "John Doe"
}
}
}
```
####2.物理视图
尽管一个概念层次的表格可能看起来是由一些列稀疏的行组成,但他们是通过**列族来存储**的。一个新建的限定符(column_family:column_qualifier)可以随时地添加到已存在的列族中。
![Paste_Image.png](https://img.haomeiwen.com/i2061490/62349c9b0833d1a7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
概念视图中的空单元实际上是没有进行存储的。因此对于返回时间戳为t8的contents:html的值的请求,结果为空。同样的,一个返回时间戳为t9的anchor:my.look.ca的值的请求,结果也为空。然而,如果没有指定时间戳的话,那么会返回特定列的最新值。对有多个版本的列,优先返回最新的值,因为时间戳是按照递减顺序存储的。因此对于一个返回com.cnn.www里面所有的列的值并且没有指定时间戳的请求,返回的结果会是时间戳为t6的contents:html 的值、时间戳 t9的anchor:cnnsi.com f的值和时间戳t8的 anchor:my.look.ca 。
####物理存储
![Paste_Image.png](https://img.haomeiwen.com/i2061490/5788eaad8f2d5718.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![Paste_Image.png](https://img.haomeiwen.com/i2061490/c505aabb2f3dbe1b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
```
1.Table 中所有行按照row key 的字典排序
2.Table 在行的分割方向上分割为多个Region
3. Region 按大小分割的,每个表开始只有一个Region 随着数据增多,region 不断增大,当增
大到一个阀值的时候。Region 就会等分成2个Region 之后会有越来越多的Region
4. Region是Hbase 中分布式存储和负载均衡的最小单元,不同的Region 分布在不同的RegionServer
5.Region虽然是分布式存储的最小单元,但并不是存储的最小单元。Region由一个或者多个Store组成,每个store保存一个columns family;每个Strore又由一个memStore和0至多个StoreFile组成,StoreFile包含HFile;memStore存储在内存中,StoreFile存储在HDFS上
```
####2.Hbase基本组件
![Paste_Image.png](https://img.haomeiwen.com/i2061490/b7893a723c270adb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
######Client
包含访问HBase的接口,并维护cache来加快对HBase的访问,比如region的位置信息
######Master
为Region server分配region
负责Region server的负载均衡
发现失效的Region server并重新分配其上的region
管理用户对table的增删改查操作
######Region Server
Regionserver维护region,处理对这些region的IO请求
Regionserver负责切分在运行过程中变得过大的region
######Zookeeper作用
通过选举,保证任何时候,集群中只有一个master,Master与RegionServers 启动时会向ZooKeeper注册
存贮所有Region的寻址入口
实时监控Region server的上线和下线信息。并实时通知给Master
存储HBase的schema和table元数据
默认情况下,HBase 管理ZooKeeper 实例,比如, 启动或者停止ZooKeeper
Zookeeper的引入使得Master不再是单点故障
![Paste_Image.png](https://img.haomeiwen.com/i2061490/aaae5aa526297252.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![Paste_Image.png](https://img.haomeiwen.com/i2061490/fb1ce199ca026ebd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**该机制用于数据的容错和恢复:**
每个HRegionServer中都有一个HLog对象,HLog是一个实现Write AheadLog的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中(HLog文件格式见后续),HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此ReplayHLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复
**HBase容错性**
Master容错:Zookeeper重新选择一个新的Master
无Master过程中,数据读取仍照常进行;
无master过程中,region切分、负载均衡等无法进行;
**RegionServer容错:**
定时向Zookeeper汇报心跳,如果一旦时间内未出现心跳,Master将该RegionServer上的Region重新分配到其他RegionServer上,失效服务器上“预写”日志由主服务器进行分割并派送给新的RegionServer
***Region定位流程:***
![Paste_Image.png](https://img.haomeiwen.com/i2061490/157984e2dc5fcfe5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**(1)寻找RegionServer**
ZooKeeper-->-ROOT-(单Region)-->.META.-->用户表
**(2)-ROOT-**
表包含.META.表所在的region列表,该表只会有一个Region;
Zookeeper中记录了-ROOT-表的location。
**(3).META.**
表包含所有的用户空间region列表,以及RegionServer的服务器地址。