HBase之 HRegionServer作用
HBase之 HRegionServer作用
HBase是Apache开发的开源非关系型数据库,用于处理大规模数据存储。作为HBase系统中最核心的组件之一,RegionServer主要负责用户数据的写入和读取等基础操作。本文将详细介绍RegionServer的内部结构及其各个模块的作用。
RegionServer是HBase系统中最核心的组件,主要负责用户数据写入、读取等基础操作。RegionServer组件实际上是一个综合体系,包含多个各司其职的核心模块:HLog、MemStore、HFile以及BlockCache。
一个RegionServer由一个(或多个)HLog、一个BlockCache以及多个Region组成。其中,HLog用来保证数据写入的可靠性;BlockCache可以将数据块缓存在内存中以提升数据读取性能;Region是HBase中数据表的一个数据分片,一个RegionServer上通常会负责多个Region的数据读写。一个Region由多个Store组成,每个Store存放对应列簇的数据,比如一个表中有两个列簇,这个表的所有Region就都会包含两个Store。每个Store包含一个MemStore和多个HFile,用户数据写入时会将对应列簇数据写入相应的MemStore,一旦写入数据的内存大小超过设定阈值,系统就会将MemStore中的数据落盘形成HFile文件。HFile存放在HDFS上,是一种定制化格式的数据存储文件,方便用户进行数据读取。
在实际生产过程中,一般会考虑将HRegionServer和DataNode部署在相同的节点上,避免频繁的跨集群的请求
HRegionServer的作用是用于管理HRegion。官方文档中给定,每一个HRegionServer大概能够管理1000个HRegion。每一个HRegion默认能够最多管理10G数据
每一个HRegionServer包含三部分结构:1到多个WAL,1个BlockCache以及0到多个HRegion
WAL(Write Ahead Log)
发生写操作之前的日志
当HRegionServer接收到写请求之后,会先试图将请求记录到WAL中,之后再将数据更新到对应的memStore中
通过WAL这个机制,能够有效的保证数据不会产生丢失,但是因为WAL是落地在磁盘上的,因此会导致写入效率在一定程度上会降低。因此在实际过程中,如果容忍一定程度上的数据丢失的风险而想要提高写入效率,那么此时可以考虑关闭WAL机制
在HBase0.94版本之前,WAL只能采用串行写机制;从HBase0.94版本开始,引入了NIO中的Channel机制,使得WAL支持使用并行写机制,从而保证效率能够提升
BlockCache:数据块缓存
BlockCache本质上是一个读缓存,维系在内存中,默认大小是128M
在HBase中,在读取数据的时候,会将读取到的数据放到BlockCache中,从而下次再次读取数据的时候,可以从BlockCache中获取,减少对HStore的读取
BlockCache在缓存的时候,还采用了"局部性"原理。所谓的"局部性"原理本质上就是一个猜测的过程,无非是利用时间或者空间条件来合理猜测以提高命中率:
时间局部性:在HBase中,如果一条数据被读取过,那么HBase会认为这条数据被再次读取的概率要高于其他的没有被读取过的数据,那么此时HBase就会将这条数据放到缓存中 - 只要是读取过的数据就会放到缓存中
空间局部性:在HBase中,如果一条数据被读取过,那么HBase会认为与这条数据相邻的数据被读取的概率要高于其他的不相邻的数据,那么此时HBase就会将与这条数据相邻的数据也放到缓存中
随着时间的推移,BlockCache会被放满,那么此时BlockCache就会采用LRU(Least Recently Used,最近最少使用的数据就会被清理掉)策略
HRegion:HBase分布式存储和管理的基本结构,但不是数据存储的最小单位:
每一个HRegion会至少包含1个HStore,可以包含多个HStore,HStore的数量由列族的数量来决定
每一个HStore中会包含1个memStore以及0到多个HFile/StoreFile
memStore本质上是一个写缓存,维系在内存中,大小默认是128M,可以通过hbase.hregion.max.filesize属性来调节
当达到一定条件的时候,就会将memStore进行冲刷,冲刷产生HFile。HFile最终会以Block形式落地到DataNode上
memStore的冲刷条件:
当memStore被用满之后,会自动的进行冲刷,产生一个HFile
当距离上一次冲刷达到指定的时间间隔(默认是1H - 3600000ms,可以通过属性hbase.regionservers.optionalcacheflushinterval来修改,注意单位是毫秒)之后,也会自动的冲刷memStore产生HFile
当某一个HRegionServer上所有的memStore所占内存之和/实际物理内存>0.4,那么会冲刷当前HRegionServer上较大的几个memStore,直到这个值小于0.4为止
随着运行时间的推移,第三个条件更容易满足,此时会冲刷产生大量的小文件
简单来说:就是HRegionServer服务器中存储了很多的HRegion,每个HRegion是由很过个HStore组成的,每个ColumnFamily就是一个HSore。