Hbase笔记四之体系架构

上面是我画的一个简单的hbase的体系架构图,hstore中忘了画一个memstore,应该是1个memstroe和0到多个hfile


Hmaster

hmaster:用来接收用户操作负责做决策,比如region的分裂。

 

zookeeper

zookeeper:存储Hmaster和regionserver的状态负责协调管理

     Zk负责管理保存hmaster,region server的状态,为hbase各个节点提供存储服务存放hbase运行所需的所有信息,hmaster和region server启动时会去zk中注册,zk使用一致性协议保证各个节点的状态一致,zk可以实现hmaster之间的故障转移和对宕机的region server进行修复,协调所有节点的共享信息。启动hbase集群后通过hbase zkcli查看zookeeper保存的信息。

[root@shb01 ~]# hbase zkcli

进入hbase目录


Hbase下有多个目录

meta-region-server:用于存储region信息

 

backup-masters:hbase中hmaster可以有多个,此处用来存放备用hmaster的临时节点,在hbase-env.sh文件的export HBASE_BACKUP_MASTERS=${HBASE_HOME}/conf/backup-masters指定的backup-masters中可以写备用节点的名称,hbase在启动时就会启动备用节点。

  

master:如果存在多个hmaster当第一个启动后会在master下创建自己的ephemeral节点且状态为active,后来的备用hmaster则监听此文件,如果当前的hmaster宕机则该节点消失其他的hmaster得到通知后会将自身改为active,而他们的ephemeral节点就在backup-masters目录下。

 

rs:Hmaster和regionserver连接到zk后会创建ephemeral节点,zk使用心跳机制维持其存在,若某个ephemeral节点失效则hmaster节点会接到通知并做处理。而这些ephemeral节点默认存储在/hbase/rs下,Hmaster会监听它来监控region server的加入和宕机。下图中有两个ephemeral节点分别是139和shb01


如果某个region server宕机则与zk连接中断,对应的ephemeral节点就会消失。Zk通过心跳机制接收到后会做处理。我在139上kill掉regionserver进程后rs目录下就只剩shb01的regionserver的ephemeral节点。



HRegionServer

Region server负责数据的存储,包含hbase的核心组件如WAL(Hlog),HRegion(会有多个),BlocakCache,MemStore,Hfile。但归根结底数据是要存储在hdfs上的所以一般和datanode位于同一台服务器上以实现数据本地化。

Region:负责存储数据,内部由多个hstore组成每个hstore对应一个列族也就是说一个region中会存储多个列族

hstore:包含memstore和storefile,写入时会先些memstore,写满后会flush成一个storefile

Hfile:是hstore的底层实现,实际负责数据存储是hbase的最小单位,可以对其进行拆分更有利于读取

 

Client

客户端和regionserver交互时使用rpc连接比较耗费资源,所以会使用缓存然后批量写入数据以提高效率。

写操作put:

client会将数据写入regionserver中的两个地方WAL(WriteAhead Log磁盘文件)和memstore(内存)并最终写入hdfs,先写WAL(hlog)后写memestore两者均成功才算写入成功。Regionserver宕机重启后会先加载hlog中的数据然后用这些数据恢复宕机时内存丢失的数据。

读操作get,scan:

Client根据行键在不同的region中查找数据(行键,region的对应关系存储在命名空间meta中),确定region后会先在memestore(内存)找,找不到后会在hfile(磁盘)中找,无论数据在memstroe或是hfile中hbase都会汇总后再返回。

Hbase1.0之后一个regionserver会有多个WAL,在高频写入时可以关闭WAL以提高速度但是会有丢失数据的风险。

 

Lsm-tree

Lsm-tree是为了解决数据高速无序写入有序存储问题。

1数据按照写入顺序保存在wal中,此时是无序的没有按照rowkey排序保存。

2一旦写入到wal中后数据就会立刻被保存到memstore中,而此时memstore中保存的数据是按照rowkey排序的。

3Memstore中存储的数据达到一定的阀值后就会被flush到hfile中,Flush一次会生成一个hfile,随着时间推移hfile会越来越多后台线程会合并众多的hfile文件生成一个大文件而此大文件中的数据是按照rowkey排序的。通常在读取数据时是先memstore后读hfile。

 

Bloom filter:在打开hfile文件之前时会判断数据是否存在于文件中如果在则打开不在则不打开这样可以提高效率。Bloom filter用来快速解决使用很小的内存来判断一个元素是否在集合中的问题,

 

Region,Hstroe,MemStore,Hfile

Hbase中表会按照行键划分为多个region,这些region存储在一个或多个regionserver中,Region中按照表的列族划分为多个hstore,hstroe中存在一个memstroe和0到多个hfile。一般最好将具有相似IO特性的字段存储在同一个列族中。

Hstroe是hbase存储的核心它实现了读写hdfs,region是按照行键划分的它记录了startkey和endkey,因此client可以通过hmaster快速定位一个行键位于哪个region中。

Region切分

   Region过大时会执行region的切分由hmaster发出执行配合zookeeper有regionserver完成。

1.      Hmaster发出指令在zk中将parentregion标记为split状态

2.      创建split目录

3.      Parent region关闭写操作执行flush

4.      在split中parent region分裂产生两个regionA和regionB

5.      Parent region通知 hbase命令空间中的meta表下线,已分裂出的两个region上线。

切分的算法在0.94之前由参数hbase.hregion.max.filesize控制默认是10G,当region中任何一个hstroe大于此值时将region中的hstroe平均切分成两个分别存储在regionA和regionB中,0.94后是通过一个算法math.min(hbase.hregion.max.filesize,tableRegionCount的立方*hbase.hregion.memstore.flush.size), tableRegionCount表示一个表在regionserver中region的数量hbase.hregion.memstore.flush.size默认128M,二者取最小值当hstroe大于此值时执行切分。

 

Memstore刷新

写入时会先写WAL日志信息然后是region的memestore,memstroe达到一定的阀值后Hbase在会以region为单位刷新所有的memstore生成hfile文件。

1.hbase中会有一个线程每隔10秒钟检查一次region中所有memstroe的大小,若有一个memstore的大小超过hbase_site.xml中的hbase.hregion.memstore.flush.size规定的大小(默认128M)则会启动flush,此时不会阻碍写操作。间隔时间为hbase.server.thread.wakefrequency参数的值默认10秒。

 

2.当一个region中所有memstore的总和达到hbase.hregion.memstore.block.multiplier * hbase.hregion.memstore.flush.size规定的值时hbase强制启动flush操作,此时阻塞写操作flush完毕后才能写入。hbase.hregion.memstore.block.multiplier在0.96版本是2在1.1.5版本之后为4,所以在我的例子中值为4*128=512M。

 

3.当一个regionserver中所有的region中所有的memstroe的占用量和hbase堆的比值超过hbase.regionserver.global.memstore.upperLimit规定的值时(默认0.4即40%)强制启动flush并阻塞写操作,当占用量达到hbase.regionserver.global.memstore.lowerLimit规定的值(默认0.35即35%)时hbase会选取内存占用比较大的memstore启动flush并阻碍此memstore的写操作

小于0.35时会停止flush操作。

Hbase的堆大小在hbase-env.sh文件中由HBASE_HEAPSIZE参数指定默认1G。

一般在hbase突然高速写入时会触发upperLimit

 

4.hbase会定时(默认1小时)启动flush防止数据固化在内存中,regionserver中所有的memstore都会被flush,但是hbase为了防止所有的memstore在同一时刻执行flush,每个memstore都会有一定的延时,此项貌似是受参数hbase.regionserver.optionalcacheflushinterval控制(需要验证)。

 

5.在hbase shell中有flush和compact命令可以手动启动flush。

 

Hfile

每次flush会生成一个hfile,hfile中主要由datablock存储数据是一个kv键值对,key是行键value是列族+列限定符+时间戳+value,所以命名列族列名称时尽量短小。

删除操作时只会把数据标记为被删除,而查询时会忽略被标记的数据。后台线程在执行大合并时这些被标记的数据才会被删除,hfile是有序存储的而多个hfile之间是无序的,大合并会对所有的hfile进行合并并产生一个大的hfile而这个文件是按照rowkey排序的是有序的文件。

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值