HBase-架构原理

Posted 码农大腿哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HBase-架构原理相关的知识,希望对你有一定的参考价值。

前言:

这一篇应该是HBase最难的部分了,涉及了HBase的底层运行机制。 可以选择性略过,因为这些操作都是在后台自动运行的,用户感知不到

不过,如果你想学好HBase,学会HBase的优化,那么这篇就是重中之重

本篇目标:
1.掌握底层运行机制的概念以及产生的影响
2.了解这些 底层运行机制 的触发时机



01


MemStore flush


刚写入的数据会先保存在MemStore,然后再持久化到磁盘,这个过程就是flush。一个MemStore只保存了一个Store的数据

发生flush时,同一region的所有MemStore都会进行flush

flush

1.flush过程

1)发生flush时,当前的MemStore被移动到快照中并被清除
2)HBase开辟新的MemStore继续提供服务
3)刷新成功后,备份快照删除

2.触发flush时机

flush最小单元是region,而不是在单个MemStore级别

1)单个MemStore大小

当一个MemStore的大小超过128M(默认值)时,该region下的所有MemStore都会flush

2)所有MemStore大小

整个regionserver中所有memstore所占空间大于heap堆内存的40%时触发flush,此时所有的memstore都会刷写,读写操作会被阻塞


为了减少阻塞对业务产生的影响,当memstore所占空间达到堆内存40%的95%时,也就是堆内存的38%,就开始刷写。如果写入的速度超过刷写速度,memstore所占空间超过堆内存40%,读写才会阻塞


3)根据时长flush

由MemStore最后一次编辑的时间决定,默认最后一次编辑超过1小时就进行flush

当然也可以手动执行flush

3.flush时删除数据

flush时会把过期数据删除掉,如果两条Row Key相同的数据先后写入MemStore,(一定要同时在一个内存中),那么flush时会把老的那条删掉,只flush最新的数据



02


StoreFile Compaction

 

MemStore每次flush都会产生一个新的HFile,这样就会产生很多小文件。而且一个数据的不同版本可能存在不同的HFile中,查询时就要遍历很多HFile

为了减少HFile文件数,以及清理过期和已删除的数据。HBase会对HDFS上的HFile文件进行合并,把小的合成大的。这个过程就是StoreFile Compaction

Compaction

1.StoreFile Compaction的类型

StoreFile Compaction分为两种:

1)Minor Compaction-小合并

小合并会将临近的若干个较小的HFile文件合并成一个较大的HFile文件,但不会清理过期和删除的数据

合并后产生一个新的H File文件,老 HFile文件不会立即删除,要等一段时间才删除

2)Major Compaction-大合并


大合并会将一个Store下的所有的HFile合并成一个大HFile, 并且会清理掉过期和删除的数据


2.Compaction触发时机

同一个Store下的HFile文件个数达到3个时会触发Minor Compaction,数据合并写入新的HFile文件

Major Compaction默认7天自动执行一次,生产中一般禁止自动执行。因为非常消耗资源,一般在空闲时手动执行

3.Major Compaction删除数据

当我们执行删除数据的命令时,这条数据不会立即删除。HBase会给这条数据打上一个标记,查询的时候这条数据就不会返回。过期的数据,也就是一条数据的老版本,不会打这个标记

当发生Major Compaction时,标记删除的数据和过期的数据都会被清理掉。不会写入新的HFile


PS:

HBase可以指定保留数据的版本数,默认删除数据时只保留一个最新版本



03


Region Split


每个Table起初只有一个region,随着数据不断写入region会越来越大。如果region变得过大,region server就要考虑对region进行拆分


1.split过程

拆分在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官方文档,文档介绍的更加详细

2.split触发时机

当1个region中的某个Store下所有StoreFile的总大小超过某值(z)时,该Region就会进行拆分

该值(z)的计算规则:

x = hbase.hregion.memstore.flush.size(默认128M)y = hbase.hregion.max.filesize(默认10G)z = Min( R^2 * x , y )(R是一个节点上一张表的region数)

3.热点问题

在split触发时机中我们可以看出来,当表越来越多后,region达到10G才发生一次切割

这样有的region很小,有的region可能到了9G还没切割,此时不同机器可能出现负载不均衡

热点问题可以通过预分区解决,我将在HBase优化中介绍这部分



你学废了吗?

—  END  —



以上是关于HBase-架构原理的主要内容,如果未能解决你的问题,请参考以下文章

了解Hbase吗?说下Hbase的架构原理

Hbase的架构原理核心概念

HBase架构原理

HBase架构组成及原理

HBase-整体架构及读写原理

详解HBase架构原理