HBase在百亿数据场景下,为什么查询速度依然非常快?¶
一、HBase简介¶
HBase适合存储PB级别的海量数据(百亿千亿量级记录),如果根据记录主键Rowkey来查询,能在几十到百毫秒内返回数据。
HBase核心概念¶
- Rowkey:每一行的唯一标识
- 列族(Column Family):列的集合,分开存储
- 列(Column):具体的列
- 单元格(Cell):列的value值
二、查询过程分析¶
HBase之所以能在百亿数据下保持快速查询,主要得益于其分布式存储结构和多层索引机制。
整体架构¶
假设场景: - 100亿条业务数据 - 存储在HBase集群上(多个服务器数据节点) - 总空间:10TB - 切分为5000个Region
每个Region大小 = 10TB / 5000 = 2GB
三、查询步骤详解¶
第1步:定位Region¶
HBase的Master帮我们迅速定位到记录所在的数据节点和数据节点中的Region。
- 100亿条记录,切分成5000个Region
- 每个Region约2GB
- 只需查询这2GB的记录文件,就能找到对应记录
第2步:定位列族¶
HBase存储数据是按照列族存储的。例如: - 前100个字段:人员信息列族 - 中间100个字段:公司信息列族 - 最后100个字段:交易信息列族
这三个列族是分开存储的,这样的存储结构保证了HBase可支持的表的宽度(字段数)可达到百万个。
假设2GB的Region文件,分为4个列族: - 每个列族 = 2GB / 4 = 500MB
第3步:定位HFile¶
每个列族在底层,包含1个或多个HFile(更细粒度的存储文件)。
- HFile一般大小:100MB
- 该列族包含5个HFile
由于HBase的内存和磁盘中的数据是排好序的,按平均计算,只需遍历 2.5个HFile = 250MB,即可找到对应记录。
第4步:查找Key/Value¶
每个HFile中,以键值对(key/value) 方式存储,只需遍历文件中的key位置即可。
- 假设key/value比是1:25
- 最终只需 10MB 的数据量,就能获取对应记录
查询时间估算¶
| 存储介质 | 访问速度 | 查找10MB数据耗时 |
|---|---|---|
| 机械磁盘 | 100MB/S | 0.1秒 |
| SSD | 更快 | 0.01秒 |
另外,HBase有内存缓存机制,如果数据在内存中,效率会更高。
四、查询性能总结¶
为什么HBase查询速度快?¶
- 分布式架构:数据分散在多个节点,并行查询
- Region分区:数据按Region切分,定位快速
- 列族存储:按列族分开存储,减少读取数据量
- HFile索引:多层文件索引,快速定位
- 有序存储:数据排好序,减少遍历范围
- 内存缓存:热点数据在内存中
- Key/Value结构:高效的存储格式
HBase的优势¶
面向列存储的数据库(列簇机制): - 当表字段非常多时,可以把其中一些字段独立出来放在一部分机器上 - 另外一些字段放到另一部分机器上 - 分散存储,分散列查询
正是因为这样复杂的存储结构和分布式的存储方式,保证了HBase在海量数据下的查询效率。
总结¶
HBase通过以下机制保证了百亿数据下的快速查询:
| 机制 | 作用 |
|---|---|
| Region分区 | 数据分散到多个Region |
| 列族存储 | 按列族分开存储,减少IO |
| HFile索引 | 细粒度文件索引 |
| 有序存储 | 快速定位 |
| 内存缓存 | 热数据快速访问 |
| 分布式架构 | 并行查询 |
HBase是应对海量数据存储和查询的利器,特别适合需要根据主键进行高效点查的场景。