info:regioninfo:regionId,tableName,startKey,endKey,offline,split,replicaId;
info:server:HRegionServer对应的server:port;
info:serverstartcode:HRegionServer的启动时间戳 。
文章插图
?山东掌趣网络科技
?HRegion Server
Region Server在HDFS数据节点上运行,并具有以下组件:
WAL: 预写日志是分布式文件系统上的文件 。WAL用于存储尚未持久存储的新数据 。发生故障时用于恢复 。
BlockCache:是读取缓存 。它将经常读取的数据存储在内存中 。满时将逐出最近最少使用的数据 。
MemStore:是写缓存 。它存储尚未写入磁盘的新数据 。在写入磁盘之前先对其进行排序 。每个区域的每个列族都有一个MemStore 。
HRegion:一个Table可以有一个或多个Region,他们可以在一个相同的HRegionServer上,也可以分布在不同的HRegionServer上,一个HRegionServer可以有多个HRegion,他们分别属于不同的Table 。HRegion由多个Store(HStore)构成,每个HStore对应了一个Table在这个HRegion中的一个Column Family,即每个Column Family就是一个集中的存储单元,因而最好将具有相近IO特性的Column存储在一个Column Family,以实现高效读取(数据局部性原理,可以提高缓存的命中率) 。HStore是HBase中存储的核心,它实现了读写HDFS功能,一个HStore由一个MemStore 和0个或多个StoreFile组成
MemStore(In Memory Sorted Buffer),所有数据的写在完成WAL日志写后,会 写入MemStore中,由MemStore根据一定的算法将数据Flush到地层HDFS文件中(HFile),通常每个HRegion中的每个 Column Family有一个自己的MemStore 。
HFile在HFile中的数据是按RowKey、Column Family、Column排序,对相同的Cell(即这三个值都一样),则按timestamp倒序排列 。
文章插图
?山东掌趣网络科技
?
当客户端发起一个Put请求时,首先它从hbase:meta表中查出该Put数据最终需要去的HRegionServer 。然后客户端将Put请求发送给相应的HRegionServer,在HRegionServer中它首先会将该Put操作写入WAL日志文件中(Flush到磁盘中) 。
文章插图
?山东掌趣网络科技
?
写完WAL日志文件后,HRegionServer根据Put中的TableName和RowKey找到对应的HRegion,并根据Column Family找到对应的HStore,并将Put写入到该HStore的MemStore中 。此时写成功,并返回通知客户端 。MemStore是一个In Memory Sorted Buffer,在每个HStore中都有一个MemStore,即它是一个HRegion的一个Column Family对应一个实例 。它的排列顺序以RowKey、Column Family、Column的顺序以及Timestamp的倒序,如下所示:
文章插图
?山东掌趣网络科技
?
每一次Put/Delete请求都是先写入到MemStore中,当MemStore满后会Flush成一个新的StoreFile(底层实现是HFile),即一个HStore(Column Family)可以有0个或多个StoreFile(HFile) 。有以下三种情况可以触发MemStore的Flush动作,需要注意的是MemStore的最小Flush单元是HRegion而不是单个MemStore 。
当一个HRegion中的所有MemStore的大小总和超过了
hbase.hregion.memstore.flush.size的大小,默认128MB 。此时当前的HRegion中所有的MemStore会Flush到HDFS中 。
当全局MemStore的大小超过了
hbase.regionserver.global.memstore.upperLimit的大小,默认40%的内存使用量 。此时当前HRegionServer中所有HRegion中的MemStore都会Flush到HDFS中,Flush顺序是MemStore大小的倒序,直到总体的MemStore使用量低于
hbase.regionserver.global.memstore.lowerLimit,默认38%的内存使用量 。
当前HRegionServer中WAL的大小超过了
hbase.regionserver.hlog.blocksize *
hbase.regionserver.max.logs的数量,当前HRegionServer中所有HRegion中的MemStore都会Flush到HDFS中,Flush使用时间顺序,最早的MemStore先Flush直到WAL的数量少于
hbase.regionserver.hlog.blocksize *
hbase.regionserver.max.logs
在MemStore Flush过程中,还会在尾部追加一些meta数据,其中就包括Flush时最大的WAL sequence值,以告诉HBase这个StoreFile写入的最新数据的序列,那么在Recover时就直到从哪里开始 。在HRegion启动时,这个sequence会被读取,并取最大的作为下一次更新时的起始sequence 。
文章插图
?山东掌趣网络科技
HFile里面的每个KeyValue对就是一个简单的byte数组 。但是这个by
te数组里面包含了很多项,并且有固定的结构 。我们来看看里面的具体结构:
推荐阅读
- 梦见自己在室外拉大便 梦见自己在室外大便有女人走过来周公解梦详解
- 带你深入了解高并发架构
- 网站架构模式
- 详解Linux Shell脚本编写技巧,附实例说明
- Java反射机制是开发第三方架构的基础
- 微信小程序架构原理
- “三”大方向,构筑5G下一站:中国移动张晓然详解R18标准演进
- 手机各项参数详解 我不允许有女孩子不会买手机
- Apache Beam 架构原理及应用实践
- 微服务架构如何实现网站服务垂直化拆分