HBase-架构原理
Posted 码农大腿哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HBase-架构原理相关的知识,希望对你有一定的参考价值。
这一篇应该是HBase最难的部分了,涉及了HBase的底层运行机制。
你
可以选择性略过,因为这些操作都是在后台自动运行的,用户感知不到
不过,如果你想学好HBase,学会HBase的优化,那么这篇就是重中之重
01
MemStore flush
刚写入的数据会先保存在MemStore,然后再持久化到磁盘,这个过程就是flush。一个MemStore只保存了一个Store的数据
发生flush时,同一region的所有MemStore都会进行flush
1)发生flush时,当前的MemStore被移动到快照中并被清除
2)HBase开辟新的MemStore继续提供服务
flush最小单元是region,而不是在单个MemStore级别
当一个MemStore的大小超过128M(默认值)时,该region下的所有MemStore都会flush
整个regionserver中所有memstore所占空间大于heap堆内存的40%时触发flush,此时所有的memstore都会刷写,读写操作会被阻塞
为了减少阻塞对业务产生的影响,当memstore所占空间达到堆内存40%的95%时,也就是堆内存的38%,就开始刷写。如果写入的速度超过刷写速度,memstore所占空间超过堆内存40%,读写才会阻塞
由MemStore最后一次编辑的时间决定,默认最后一次编辑超过1小时就进行flush
flush时会把过期数据删除掉,如果两条Row Key相同的数据先后写入MemStore,(一定要同时在一个内存中),那么flush时会把老的那条删掉,只flush最新的数据
02
StoreFile Compaction
MemStore每次flush都会产生一个新的HFile,这样就会产生很多小文件。而且一个数据的不同版本可能存在不同的HFile中,查询时就要遍历很多HFile
为了减少HFile文件数,以及清理过期和已删除的数据。HBase会对HDFS上的HFile文件进行合并,把小的合成大的。这个过程就是StoreFile Compaction
1.StoreFile Compaction的类型
StoreFile Compaction分为两种:
小合并会将临近的若干个较小的HFile文件合并成一个较大的HFile文件,但不会清理过期和删除的数据
合并后产生一个新的H
File文件,老
HFile文件不会立即删除,要等一段时间才删除
大合并会将一个Store下的所有的HFile合并成一个大HFile,
并且会清理掉过期和删除的数据
同一个Store下的HFile文件个数达到3个时会触发Minor Compaction,数据合并写入新的HFile文件
Major Compaction默认7天自动执行一次,生产中一般禁止自动执行。因为非常消耗资源,一般在空闲时手动执行
当我们执行删除数据的命令时,这条数据不会立即删除。HBase会给这条数据打上一个标记,查询的时候这条数据就不会返回。过期的数据,也就是一条数据的老版本,不会打这个标记
当发生Major Compaction时,标记删除的数据和过期的数据都会被清理掉。不会写入新的HFile
HBase可以指定保留数据的版本数,默认删除数据时只保留一个最新版本
03
Region Split
每个Table起初只有一个region,随着数据不断写入region会越来越大。如果region变得过大,region server就要考虑对region进行拆分
拆分在RegionServer上独立运行;即主机不参与
1)从region中选择某个row key作为分割点
2)刚拆分时,新创建的子region不会立即写入数据。它创建了两个引用文件,引用文件指向被拆分region的两个不同部分
3)新region的信息添加到hbase:meta表中,
处于负载均衡的考虑,Master可能会将Region转移给其他的Region Server
4)当发生compactions重写数据文件时,引用才会消失。如果子region不再引用父region的文件,父region才会被删除
分割的过程其实并没有在物理上发生分割,而是region分裂后,新region管理的数据发生了分割。随着数据不断添加,新的HFile不断产生、合并,老region原来管理的HFile慢慢都会消失
更多细节可以看HBase官方文档,文档介绍的更加详细
当1个region中的某个Store下所有StoreFile的总大小超过某值(z)时,该Region就会进行拆分
x = hbase.hregion.memstore.flush.size(默认128M)
y = hbase.hregion.max.filesize(默认10G)
z = Min( R^2 * x , y )(R是一个节点上一张表的region数)
在split触发时机中我们可以看出来,当表越来越多后,region达到10G才发生一次切割
这样有的region很小,有的region可能到了9G还没切割,此时不同机器可能出现负载不均衡
热点问题可以通过预分区解决,我将在HBase优化中介绍这部分
以上是关于HBase-架构原理的主要内容,如果未能解决你的问题,请参考以下文章
了解Hbase吗?说下Hbase的架构原理
Hbase的架构原理核心概念
HBase架构原理
HBase架构组成及原理
HBase-整体架构及读写原理
详解HBase架构原理