Hbase在以Hadoop为首的大数据生态体系当中,是受到重用的列式存储数据库。基于列式存储,是能够更加灵活地支持大数据场景下的数据存取需求的。今天的大数据开发分享,我们就来讲讲Hbase数据模型之物理模型。
HBase的列式存储,数据按列族聚簇存储在存储文件(StoreFile)中,空白的列单元格不会被存储。
Hbase物理存储模块
![](https://img.haomeiwen.com/i24710672/9a1526f6b90f69a3.png)
(1)HBase中表按照行键的范围被划分为不同的分区(Region),各个分区由分区服务器负责管理并提供数据读写服务,HBase主节点进程(HMaster)负责分区的分配以及在集群中的迁移。
(2)一个分区同时有且仅由一个分区服务器提供服务。当分区增长到配置的大小后,如果开启了自动拆分(也可以手动拆分或者建表时预先拆分),则分区服务器会负责将这个分区拆分成两个。
每个分区都有一个唯一的分区名,格式是“<表名,startRowKey,创建时间>”。一个分区下的每个列族都会有一个存储仓库(Store),因此一个表有几个列族,那么每个分区就会有几个存储仓库。
(3)每个Store(存储仓库)有且仅有一个MemStore(内存仓库),但是可以有多个存储文件。当分区服务器处理写入请求时,数据的变更操作在写入WAL后,会先写入MemStore,同时在内存中按行键排序。
当MemStore到达配置的大小或者集群中所有MemStore使用的总内存达到配置的阈值百分比时,MemStore会刷新为一个StoreFile(存储文件)到磁盘,存储文件只会顺序写入,不支持修改。
(4)数据块(block)是HBase中数据读取的最小单元,StoreFile由数据块组成,可以在建表时按列族指定表数据的数据块大小。如果开启了HBase的数据压缩功能,数据在写入StoreFile之前会按数据块进行压缩,读取时同样对数据块解压后再放入缓存。理想情况下,每次读取数据的大小都是指定的数据块大小的倍数,这样可以避免一些无效的IO,效率最高。
HBase存储模块交互
![](https://img.haomeiwen.com/i24710672/985c2ea206bb8ccc.jpg)
(1)HMaster:负责监控集群中所有的分区服务器进程,负责所有元数据的更新(如分区由哪个分区服务器提供服务)。
(2)HMaster:同时负责分区在分区服务器中的负载均衡,在一个分布式集群中,HMaster进程通常与Hadoop的NameNode运行在同一个节点,每个集群会部署至少两个HMaster节点,一个作为活跃节点提供服务,另一个作为备用节点提供快速的灾备切换,保证集群的高可用。
(3)HRegionServer:管理其负责的分区,处理分区的读写请求、分区增大的拆分(split)以及分区的压缩(compact)。、
(4)WAL:默认情况下一个分区服务器仅有一个WAL。HBase客户端数据请求操作会先写入WAL文件再写入内存仓库MemStore,这样当分区服务器宕机重启的时候,可以用WAL来恢复分区服务器的状态(如MemStore中更新的数据没有刷新到StoreFile持久化,则分区服务器启动时需要通过WAL重做(replay)数据更新来恢复)。
(5)Store:每个分区的每个列族对应一个存储仓库,一个存储仓库包含一个MemStore和多个存储文件。当MemStore的大小达到了配置的阈值后,MemStore会刷新为一个存储文件,存储文件顺序写入,不支持修改,以HFile的形式存储在Hadoop的DataNode中。
(6)MemStore:MemStore位于分区服务器的堆内存,数据在写入MemStore的时候即会按行键排序,这样刷新到存储文件的时候可以直接顺序写入,提高写性能。同时,MemStore作为一个内存级缓存,能够提供对新写入数据的快速访问(新插入数据总是比老数据使用频繁)。
关于大数据开发,Hbase数据模型之物理模型,以上就为大家做了简单的介绍了。结合到之前所讲过的Hbase逻辑模型一起来理解,也能对Hbase的数据存储有更清晰的认知。
网友评论