- 一个
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读数据流程
说明:HBase集群,只有一张
meta
表,此表只有一个region
,该region
数据保存在一个HRegionServer
上
-
客户端首先与
zookeeper
进行连接;- 从
zk
找到meta
表的region
位置,即meta
表的数据 一HRegionServer
上; - 客户端与此
HRegionServer
建立连接,然后读取meta
表中的数据;meta
表中存储了所有用户表的region信息,我们可以通过scan 'hbase:meta'
来查看meta表信息
- 从
-
根据要查询的
namespace
、表名和rowkey
信息。找到写入数据对应的region
信息 -
找到这个
region
对应的regionServer
,然后发送请求 -
查找并定位到对应的
region
-
先从
memstore
查找数据,如果没有,再从BlockCache
上读取HBase
上Regionserver
的内存分为两个部分- 一部分作为
Memstore
,主要用来写; - 另外一部分作为
BlockCache
,主要用于读数据;
-
如果
BlockCache
中也没有找到,再到StoreFile
上进行读取- 从
storeFile
中读取到数据之后,不是直接把结果数据返回给客户端,而是把数据先写入到BlockCache
中,目的是为了加快后续的查询;然后再返回结果给客户端。
- 从
HBase写数据流程
-
客户端首先从
zk
找到meta
表的region
位置,然后读取meta
表中的数据,meta
表中存储了用户表的region
信息 -
根据
namespace
、表名和rowkey
信息。找到写入数据对应的region
信息 -
找到这个
region
对应的regionServer
,然后发送请求 -
把数据分别写到
HLog
(write ahead log)和memstore
各一份 -
memstore
达到阈值后把数据刷到磁盘,生成storeFile
文件
补充:
HLog(write ahead log):
也称为WAL意为Write ahead log,类似mysql中的binlog,用来做灾难恢复时用,HLog记录数据的所有变更,一旦数据修改,就可以从log中进行恢复。
Views: 11