开发者学堂课程【HBase入门教程:HBase 原理_4】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/397/detail/5064
HBase 原理_4
内容介绍
一、HBase 存储模型
二、HBase 数据模型
一、HBase 存储模型
Region
HBase 自动把表水平划分成多个区域(region),每个 region 会保存一个表里面某段连续的数据;每个表一开始只有一个 region,随着数据不断插入表,region 不断增大,当增大到一个阀值的时候,region 就会等分会两个新的region(裂变);
当 table 中的行不断最多,就会有越来越多的 region。这样一张完整的表被保存在多个 Regionserver 上。
一个表对应多行数据,当数据很大的时候就会对表进行切分。刚开始创建表的时候只有一个 region。当一个 regio 再一直编写的时候就会变成很大很大,就会对表按照等分的原则来进行切分。一个表就被切分成两个 region,两个region 里面的数据本身是有顺序的。当数据再进行写入,当第一个 region 又变成很大很大,就又会对它按照等分的原则来进行切分,再产生两个 region。
频繁的产生裂变,对应的 RegionServer 就会越来越多;HMaster 发现 RegionServer 的个数过多,它就会将这台Region 移动到其他的 RegionServer 上面。从而保证 RegionServer 负载是平均的。
二、HBase 数据模型
Memstore 与 storefile
Memstore 是内存区域,写什么东西就是在 Memstore 里面写
一个 region 由多个 store 组成,一个 store 对应一个 CF(列族)
region 是将数据进行水平的切分,一个 region 里面代表连续的数据
store 包括位于内存中的 memstore 和位于磁盘的 storefile 写操作先写入 memnstore,当 memstore 中的数据达到某个阀值,hregionserver 会启动 flashcache 进程写入 storefile,毎次写入形成单独的一个 storefile
本身内存区域的都比较小,产生的 storefile 文件也是小文件。按照正常逻辑,会对这个文件做一些合并,合并成大文件来处理。
合并分为两种
minor(属于小范围的合并,一般来说就是个位数,3~5个;随时可以进行合并,只要 storefile3~5个触碰到了它的法制就可以进行合并)、major(属于大范围的合并-前一个列族进行合并之后,后一个列族就会一起合并)
合并之后不能在允许再次访问,所以需要进行优化
当 storefile 文件的数量增长到一定阈值后,系统会进行合并(minor、major compaction),在合并过程中会进行版本合并和删除工作(majar),形成更大的 storefile
此版本对应的是一个单元格,而不是一行单元格
示例:
假如版本数是1
最高的版本是1,它对应 cf1:name zhangsan
再插入 lisi
插入 lisi 的时候不是马上就把 zhangsan 删除
是在合并的时候进行删除(合并的时候发现最高的版本是1,zhangsan 是低版本,它就会把低版本都进行删除)
当一个 region 所有 storefile 的大小和数量超过一定阈值后,会把当前的 region 分割为两个,并由 hmaster 分配到相应的 regionserver 服务器,实现负载均衡
客户端检索数据,先在 memstore 找,找不到再找 storefile
此 memstore 是写缓存
写缓存-写的时候要往内存存储区写
读缓存-一块内存缓存区域,每做一个读请求的时候,执行的结果会放到内存缓存区域里面,下次再读的时候之前有操作就会直接从内存缓存区域里面读取出来。
下图大框是 store,大框右上角是 memstore,大框下的两个框是 storefile
如果读取的数据没有读到 storefile,它就是再 memstore 里面。
memstore 是写缓存,不是读缓存。读缓存是从内存里面来读;如果读取的数据是在右边 storefile 读,它的结果不会在 memstore 内存里面存储
读缓存-第一次读请求的时候,内存缓存区域就会把这一次操作加载结果加载到缓存区域里面;第二次在读取的时候,如果是相同操作,就不需要在往大框里面拿取了,就直接从缓存区域里面拿取。