Hbase学习日记:四、Hbase架构

一、HRegion

1.在Hbase中,会将一个表从水平方向上进行切分,切分成1个或者多个HRegion
2.切分之后,每一个HRegion都会交给某一个HRegionServer来进行管理。那一个HRegionServer可以管理多个HRegion吗?
Hbase学习日记:四、Hbase架构_第1张图片
3.一个表至少包含1个HRegion,可以包含多个HRegion
4.在HBase中,行键是有序的。因此从水平方向上来进行切分,切分后的HRegion之间的行键也是有序的,不交叉的(单个HRegion里的行键是有序的;将多个HRegion拼起来后,行键也是有序的)
5.因为HRegion会交给HRegionServer来管理,并且HRegion之间的数据是不交叉的。所以保证了所有的请求会被分散到不同的HRegion节点上来处理(每个行键被访问的概率都是相同的,也就是负债均衡)
6.随着运行时间的推移,HRegion管理的数据会不断增多,达到指定的条件后,HRegion会自动进行分裂

7.每一个HRegion包含1个或多个HStore,HStore的数量由列族的数量来决定,一个列族对应一个HStore
8.每一个HStore都会包含一个memStore,以及包含0到多个HFile(以前HFile叫StoreFile),即
Hbase学习日记:四、Hbase架构_第2张图片

二、Zookeeper的作用

1.在HBase中,zookeeper充当了注册中心
2.当HBase启动后,会自动在Zookeeper上注册一个/hbase节点
3.当HMaster启动后,会自动在Zookeeper上注册一个临时节点/hbase/master。
当Active HMaster宕机之后,这个临时节点就会消失,此时Zookeeper就会从Backup HMaster中选择最早注册的节点来切换Active状态
4.当Backup HMaster启动之后,会自动在Zookeeper上注册一个临时节点/hbase/backup-masters
5.当HRegionServer启动之后,会自动在Zookeeper上的/hbase/rs(rs就是RegionServer的简写)节点下注册子节点

三、HMaster

1.在HBase中,允许用户在任意一台安装了HBase的节点上来启动HMaster,理论上不限制HMaster的数量,来实现HMaster的高可用。
2.HMaster启动命令
hbase-daemon.sh start master
3.在HBase中,如果启动了多个HMaster,最先启动的HMaster会在Zookeeper上注册为Active状态,后注册的HMaster会注册为Backup状态。所以Active状态的HMaster只有一个,Backup状态的HMaster可以有0到多个。
4.当Active HMaster接收到请求之后,需要考虑将数据同步给其他所有Backup Master,同步的节点数量越多,效率就越低。
因此在HBase中,虽然理论上不限制Backup Master的数量;但实际中推荐1个Active HMaster + 2个Backup HMaster。
Active HMaster会实时监控Zookeeper上/hbase/backup-masters下的节点变化,以确定要同步的节点是哪几个
5.HMaster的作用
1)决定HRegion交由哪一个HRegionServer来进行管理
2)记录和存储元数据。HBase的元数据包含:namespace名、table名、column family以及属性等。产生元数据的操作会经过HMaster,不产生元数据的操作不经过HMaster

四、HBase的读写流程

当客户端进行表的读写操作的时候,会进行如下图流程
Hbase学习日记:四、Hbase架构_第3张图片
但是看上图,客户端读取一次HBase的数据,要经历三次请求,这未免效率也太低了,为了提升效率,有以下机制。
1)当客户端第一次请求Zookeeper之后,会自动缓存hbase:meta文件的位置,之后客户端的每次请求就可以不用再访问Zookeeper了
2)当客户端获取到HRegion的位置之后,也会自动缓存这个HRegion的位置,之后如果还操作这个HRegion,就可以直接访问
3)随着时间的推移,客户端缓存会越来越多,效率也就会越来越快。但是如果客户端发生宕机,那么缓存就会丢失。

五、HRegionServer

1.在实际生产过程中,一般会考虑将HRegionServer和DataNode部署在相同的节点上,避免频繁的跨集群的请求
2.HRegionServer的作用是用于管理HRegion。官方文档中给定,每一个HRegionServer大概能够管理1000个HRegion,每一个HRegion默认最多管理10G的数据
3.每一个HRegionServer包含三部分结构:1到多个WAL,1个BlockCache以及0到多个HRegion
Hbase学习日记:四、Hbase架构_第4张图片

什么是WAL? 写缓存
WAL(Write Ahead Log):写操作之前的日志
1.当HRegionServer接收到写请求之后,会先试图将请求记录到WAL中,之后再将数据更新到对象的memStore中
为什么需要先写到WAL中?而不直接写到HDFS中?因为HBase的rowkey是有序的,所以不能将数据直接写到HDFS中,首先要在memStore中排序,排好序在写到HDFS中。而memStore是在内存中的,万一程序崩溃,那么在memStore的数据就会丢失。为了防止数据丢失,所以在写入memStore前,先记录到WAL中,顺便用WAL记录日志。
2.因为WAL是写磁盘的,所以会降低写操作的效率。如果能接受数据丢失的风险,那么可以关闭WAL。
3.在HBase0.94版本之前,WAL只能采用串行写;从HBase0.94之后,引入了NIO中的Channel机制,WAL默认使用并行写

什么是BlockCache?读缓存
BlockCache:数据块缓存
1.BlockCache本质上是一个读缓存,在内存中,默认大小128M
2.在HBase中,会将读到的数据放在BlockCache中,加快效率
3.BlockCache在缓存的时候,采用2个策略去“猜测”以提高命中缓存的概率
1)时间局部性:HBase认为一条数据被读取,那么下次被读取的概率会比较高,所以会放入缓存中
2)空间局部性:HBase认为一条数据被读取,那么这条数据相邻的数据下次被读取的概率会比较高(这个感觉不一定吧。。)

什么是HRegion?
HRegion是分布式存储和管理的基本结构,但不是数据存储的最小单位
1.每一个HRegion会至少包含1到多个HStore,HStore的数量由列族的数量决定
2.每个HStore会包含1个memStore以及0到多个StoreFile

什么是memStore?
memStore全称memory store,内存存储,
1.memStore就是用内存来缓存写操作,然后等待程序将memStore的数据写入到HDFS中。memStore大小默认为128M,可以通过hbase.hregion.max.filesize属性来调节
2.在写入HDFS之前,会先根据rowkey对数据在memStore中进行排序
3.当达到一定的条件的时候,就会将memStore进行冲刷,冲刷产生StoreFile
1)当memStore被用满之后,会自动进行冲刷,产生一个HFile
2)每隔一段时间间隔(默认为1hour - 3600000ms,可以通过属性hbase.regionservers.optionalcacheflushinterval来修改,注意单位是毫秒)之后,也会自动的冲刷memStore产生HFle
3)当某一个HRegionServer上所有的memStore所占内存之和/实际物理内存 > 0.4,那么就会冲刷当前HRegionServer上比较大的memStore,直到这个值小于0.4为止(第三个这个机制是为了防止在1个间隔时间段内,每个memStore都几乎用满的极端情况下,内存占用太多)

随着时间的推移,我们发现,第三个条件更容易满足,此时就会冲刷产生大量的小文件。所以就有了下面的Compaction合并机制。

六、Compaction合并机制

1.在HBase中,提供了2种Compaction机制:minor compact 和 major compact
1)minor compact:轻微地合并。在合并的时候,会将当前HStore中相邻的几个小HFile合并成一个大的HFile,原本就是大的HFile不参与合并,因此合并完成之后依然存在多个HFile
2)major compact:主要的合并。在合并的时候,会将当前HStore中所有HFile进行合并,因此合并完成之后只存在一个HFile
2.相对而言,minor compact合并效率更高一些,HBase中默认采用的合并机制也是minor compact。实际过程中,也会用到major compact,但是因为major compact的效率较低,需要对大量数据进行读写,因此一般是放在相对空闲的时间来进行
3.需要注意的是,在major compact的时候,会自动清理掉被标记为删除的数据(HBase删除是逻辑删除)或者过时的数据(HBase修改是通过版本来实现的,过时的数据就是旧版本的数据)。

你可能感兴趣的:(大数据,hbase,学习,架构)