Hbase数据存储原理与读写详解

发布时间:2020-08-30 22:20:54 来源:51CTO 阅读:36 作者:victor19901114 栏目:大数据

1、HBase的数据存储原理

Hbase数据存储原理与读写详解

一个HRegionServer会负责管理很多个region

一个*region包含很多个store

一个列族就划分成一个store**

如果一个表中只有1个列族,那么每一个region中只有一个store

如果一个表中有N个列族,那么每一个region中有N个store

一个store里面只有一个memstore

memstore是一块内存区域,写入的数据会先写入memstore进行缓冲,然后再把数据刷到磁盘

一个store里面有很多个StoreFile, 最后数据是以很多个HFile这种数据结构的文件保存在HDFS上

StoreFile是HFile的抽象对象,如果说到StoreFile就等于HFile

每次memstore刷写数据到磁盘,就生成对应的一个新的HFile文件出来

Hbase数据存储原理与读写详解

2、HBase数据读流程

Hbase数据存储原理与读写详解


说明:HBase集群,只有一张meta表,此表只有一个region,该region数据保存在一个HRegionServer上

1、客户端首先与zk进行连接;从zk找到meta表的region位置,即meta表的数据存储在某一HRegionServer上;客户端与此HRegionServer建立连接,然后读取meta表中的数据;meta表中存储了所有用户表的region信息,我们可以通过scan 'hbase:meta'来查看meta表信息

2、根据要查询的namespace、表名和rowkey信息。找到写入数据对应的region信息

3、找到这个region对应的regionServer,然后发送请求

4、查找并定位到对应的region

5、先从memstore查找数据,如果没有,再从BlockCache上读取

HBase上Regionserver的内存分为两个部分

一部分作为Memstore,主要用来写;

另外一部分作为BlockCache,主要用于读数据;

6、如果BlockCache中也没有找到,再到StoreFile上进行读取

从storeFile中读取到数据之后,不是直接把结果数据返回给客户端,而是把数据先写入到BlockCache中,目的是为了加快后续的查询;然后在返回结果给客户端。

3. HBase写数据流程

Hbase数据存储原理与读写详解

1、客户端首先从zk找到meta表的region位置,然后读取meta表中的数据,meta表中存储了用户表的region信息

2、根据namespace、表名和rowkey信息。找到写入数据对应的region信息

3、找到这个region对应的regionServer,然后发送请求

4、把数据分别写到HLog(write ahead log)和memstore各一份

5、memstore达到阈值后把数据刷到磁盘,生成storeFile文件

6、删除HLog中的历史数据

补充: HLog(write ahead log): 也称为WAL意为Write ahead log,类似mysql中的binlog,用来做灾难恢复时用,HLog记录数据的所有变更,一旦数据修改,就可以从log中进行恢复。 4、HBase的flush机制 4.1、flush触发条件 4.1.1、memstore级别限制

当Region中任意一个MemStore的大小达到了上限(hbase.hregion.memstore.flush.size,默认128MB),会触发Memstore刷新。

<property> <name>hbase.hregion.memstore.flush.size</name> <value>134217728</value> </property> 4.1.2 、region级别限制

当Region中所有Memstore的大小总和达到了上限(hbase.hregion.memstore.block.multiplier hbase.hregion.memstore.flush.size,默认 2 128M = 256M),会触发memstore刷新。

<property> <name>hbase.hregion.memstore.flush.size</name> <value>134217728</value> </property> <property> <name>hbase.hregion.memstore.block.multiplier</name> <value>2</value> </property> 4.1.3、Region Server级别限制

当一个Region Server中所有Memstore的大小总和超过低水位阈值hbase.regionserver.global.memstore.size.lower.limit*hbase.regionserver.global.memstore.size(前者默认值0.95),RegionServer开始强制flush;

先Flush Memstore最大的Region,再执行次大的,依次执行;

如写入速度大于flush写出的速度,导致总MemStore大小超过高水位阈值hbase.regionserver.global.memstore.size(默认为JVM内存的40%),此时RegionServer会阻塞更新并强制执行flush,直到总MemStore大小低于低水位阈值

<property> <name>hbase.regionserver.global.memstore.size.lower.limit</name> <value>0.95</value> </property> <property> <name>hbase.regionserver.global.memstore.size</name> <value>0.4</value> </property> 4.1.4、HLog数量上限

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。