Hbase的读写流程,一个HRegions
查看hbase基本介绍的参考hbase的基本介绍和表模型
#博学谷IT学习技术支持#
1.hbase的逻辑结构
2.hbase的物理结构
3.hbase的集群架构
主节点HMaster的作用:
- 管理众多从节点
- 用于分配region给从节点
- 负责元数据管理操作
从节点HRegionserver的作用:
- 管理众多从节点
- 用于分配region给从节点
- 负责元数据管理操作
Hbase集群中可以有多个Hmaster(一主多备)和多个HRegionserver组成。
一个HRegionserver由一个HLog和多个Region组成,一个Region由Stroe模块组成,一个Store模块由一个Mem Store和多个StoreFile组成。
StoreFile
保存实际数据的物理文件,StoreFile 以 HFile 的形式存储在 HDFS 上。每个 Store 会有一个或多个 StoreFile(HFile),数据在每个 StoreFile 中都是有序的。
MemStore
写缓存,由于 HFile 中的数据要求是有序的,所以数据是先存储在 MemStore 中,排好序后,等到达刷写时机才会刷写到 HFile,每次刷写都会形成一个新的 HFile。
WAL
由于数据要经 MemStore 排序后才能刷写到 HFile,但把数据保存在内存中会有很高的概率导致数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Ahead logfile 的文件中,然后再写入 MemStore 中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
集群结构中的Region和Store模块与逻辑架构的类比:
Region模块:
类似与表中的横向切割,是以row key按照排序从小到大居中分割的。
Store模块:
类似与表中的纵向切割,是列族为单位切割的。
一个表可以被分成多个region,这些region可以被不同的RegionServer管理,这样可以起到分布式的作用,提高并发能力;一个region可以包括多个Store模块。
4.Hbase的读取数据流程
-
1 客户端发起读取数据的请求, 首先会先连接zookeeper
-
2从zookeeper中获取一个 hbase:meta表 被那个RegionServer所管理着
hbase:meta: hbase的元数据表, 在这个表中存储了自定义的表相关元数据, 包含: 表名, 表有那些列族, 表有几个Region构成的, 每个Region被那个RegionServer管理meta表只有一个Region, 而这个Region必然会被某一个RegionServer所管理, 至于被那个RegionServer所管理了呢?
zookeeper清楚
从zookeeper中的/hbase/meta-region-server获取hbase:meta表所在的节点:
图中看出hbase:meta表在node2节点上。 -
3 连接meta表对应RegionServer, 从meta表获取当前要读取的这个表对应的Region是那些, 并且这些Region对应的RegionServer是谁当表有多个Region的时候: 如果执行的Get操作获取某一条数据, 只会返回一个RegionServer的地址;如果执行的Scan操作, 会将所有的Region对应RegionServer地址全部返回。
例如:查找TRANFER_RECORD表所在HRegionServer位置:
其中红框中的表示TRANFER_RECORD表所在HRegionServer位置为node3. -
4连接要读取表对应的RegionServer, 从RegionServer上开始获取数据即可:
读取顺序:
MemStore —> blockCache(缓存) —> StoreFlie(小HFile) —>大HFile
当从后续的文件中读取到数据后, 会将这一部分存储到缓存中
如果执行Scan操作, blockCache基本没有太大意义
整个读取过程, Master是否有参与呢?
Master是不参与数据读取操作。
5.写入数据流程
- 1 由客户端发起写入数据的请求, 首先会先连接zookeeper
- 2 从zookeeper中获取 hbase:meta表 被那个regionServer所管理
- 3 连接meta表对应的RegionServer地址, 从meta表获取当前要写入的表对应region被那个RegionServer所管理(一般只会返回一个RegionServer地址, 除非一次性写入多条数据)
- 4连接对应要写入RegionServer的地址, 开始写入数据, 将数据首先会写入到HLog中,然后将数据写入到对应Region的对应Store模块的MemStore中(有可能会写入到MemStore), 当这两个地方都写入完成后, 客户端认为数据写入完成了
服务端写入过程: 异步操作(可能客户端执行N多次写入后, 服务端才开始对之前的数据进行操作) - 5 随着客户端不断的写入操作, memstore中数据会越来越多, 当内存中数据达到阈值(128M / 1h)后, 就会触发flush刷新机制, 将数据<最终>刷新到HDFS上形成StoreFile(小Hfile)文件.
- 6 随着不断的刷新, 在HDFS上StoreFile文件会越来越多, 当StoreFlie文件数量达到阈值(3个及以上)后, 就会触发compact合并压缩机制, 将多个StoreFlie文件<最终>合并为一个大的HFile文件
- 7随着不断的合并, 大的HFile也会越来越大, 当大HFile达到一定的阈值(<最终>10GB)后, 就会触发Split分裂机制, 将大HFile进行一分为二,形成两个新的大HFile, 同时管理这个大HFile的Region也会形成两个新的Region, 形成的两个新的Region和两个新的大HFile 进行一对一的管理即可, 原来的Region和原来的大的HFile就会下线删除掉。