HBase表格

本文深入探讨HBase的大规模数据存储能力,介绍其无模式、面向列族、多版本等特性,以及如何通过rowkey、ColumnFamily和column设计优化查询效率。同时,解析HBase的表格和RegionServer组件对应关系,揭示数据存储与读取的底层机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HBase表格

数据规模大,单表可容纳数十亿行,上百万列;

 

无模式,不像关系型数据库有严格的Scheme,每行可以有任意多的列,列可以动态增加,不同行可以有不同的列,列的类型没有限制;

 

稀疏,值为空的列不占存储空间,表可以非常稀疏,但实际存储时,能进行压缩;

 

面向列族,面向列族的存储和权限控制,支持列族独立查询;

 

数据多版本,利用时间戳来标识版本;

 

数据无类型,所有数据以字节数据形式存储。

Hbase一张表可以分别存储在几个Region上,一个Region又分成了好多store,一个store又分成了Memstore和StoreFile,当Memstore满64MB后,会把数据flush到disk上而成为storefile,当storefile数量超过3(设置)时,会启动compaction过程将它们合并为一个storefile。这个过程中会删除一些timestamp过期的数据,比如update的数据。而当合并后的storefile大小大于hfile默认最大值时,会触发split动作,也就是说,当一个Region内的所有存储文件中最大的那个HFile大于hbase.hregion.max.filesize所设置的大小,则将一个Region切分成两个Region。

HBase表格的划分

表格横向切分 

HTable包含非常多行,每行通过RowKey唯一标记,行依照RowKey的字典序排列。表在行的方向上切割为多个HRegion;

表格纵向切分

 每行包含一个RowKey和多个Column Family,数据依照Column Family进行物理分割。即不同Column Family的数据放在不同的Store中。一个Column Family放在一个Strore中。

 

 

HRegion由多个Store组成。一个Store由物理上存在的一个MemStrore(内存中)和多个StoreFileHFile)中

二、设计原则:

(1)rowkey

    a)      rowkeyhbasekey-value存储中的key。通常使用用户要查询的字段作为rowkey 查询结果作为value HBaseRowKey是依照字典序排列的
 

(2)Column Family的设计需遵循:

    a)     不同Column Family的数据,在物理上是分开的,尽量避免一次请求须要拿到的Column分布在不同的Column Family中;

    b)     CF的数量尽量要少。原因是过多的columnfamily之间会互相影响

(3) column

对于column须要扩展的应用。column可以按普通的方式设计,可是对于列相对固定的应用,最好採用将一行记录封装到一个column中的方式。这样可以节省存储空间。封装的方式推荐protocolbuffer

 

表格和regionserver组件的对应关系

HRegion

每个 HRegionServer 内部管理了一系列 HRegion ,他们可以分别属于不同的逻辑表,每个 HRegion 对应了逻辑表中的一个连续数据段。HRegionServer 只是管理表格,实现读写操作。Client 直接连接到 HRegionServer,并通信获取 HBase 中的数据。而 HRegion 则是真实存放 HBase 数据的地方,也就说 HRegion 是 HBase 可用性和分布式的基本单位。当表的大小超过预设值的时候,HBase会自动将表划分为不同的区域,每个区域就是一个HRegion,以主键(RowKey)来区分。一个HRegion会保存一个表中某段连续的数据,一张完整的表数据是保存在多个 HRegion 中的,这些 HRegion 可以在同一个HRegionServer 中,也可以来源于不同的 HRegionServer。

HStore

每个 HRegion 由多个HStore组成,每个 HStore 对应逻辑表在这个 HRegion 集合中的一个 Column Family,建议把具有相近 IO 特性的 Column 存储在同一个 Column Family 中,以实现高效读取 。HStore 由一个 Memstore 及一系列 HFile 组成,Memstore 存储于内存当中,而 HFiles 则是写入到 HDFS 中的持久性文件。用户写入的数据首先会放入 MemStore,当 MemStore大小到达预设值(可通过 hbase.hregion.memstore.flush.size 进行配置)后就会 Flush 成一个StoreFile(即 HFile)文件。

MemStore

MemStore 是一个缓存 (In Memory Sorted Buffer),当所有数据完成 WAL 日志写后,就会写入MemStore 中,由 MemStore 根据一定的算法将数据 Flush 到地层 HDFS 文件中(HFile),每个 HRegion 中的每个 Column Family 有一个自己的 MemStore。当用户从 HBase 中读取数据时,系统将尝试从 MemStore 中读取数据,如果没找到相应数据才会尝试从 HFile 中读取。当服务器宕机时,MemStore 中的数据有可能会丢失,此时 HBase 就会使用 WAL 中的记录对 MemStroe 中的数据进行恢复。

Storefile

MemStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存。

HFile

HFile 是最终保存 HBase 数据行的文件,一个 HFile 文件属于一张表中的某个列簇,当中的数据是按 RowKey、Column Family、Column 升序排序,对相同的Cell(即这三个值都一样),则按timestamp倒序排列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值