设为首页 加入收藏

TOP

【原创】HBase如何实现海量数据的毫秒级查询
2019-02-25 01:45:35 】 浏览:303
Tags:原创 HBase 如何 实现 海量 数据 查询

HBase中单表的数据量通常可以达到TB级或PB级,但大多数情况下数据读取可以做到毫秒级。HBase是如何做到的哪?要想实现表中数据的快速访问,通用的做法是数据保持有序并尽可能的将数据保存在内存里。HBase也是这样实现的。

对于海量级的数据,首先要解决存储的问题。

数据存储上,HBase将表切分成小一点的数据单位region,托管到RegionServer上,和以前关系数据库分区表类似。但比关系数据库分区、分库易用。这一点在数据访问上,HBase对用户是透明的。

数据表切分成多个Region,用户在访问数据时,如何找到该条数据对应的region呢?查找流程如下:

在HBase 0.94以前的版本中,有两个特殊的表,-Root-和.Meta. ,用来查找各种表的region位置在哪里。-Root-和.Meta.也像HBase中其他表一样会切分成多个region。-Root-表比.Meta更特殊一些,永远不会切分超过一个region。-ROOT-表的region位置信息存放在Zookeeper中,通过Zookeeper可以找到-ROOT-region托管的RegionServer。通过-ROOT-表就可以找到.META.表region位置。.META表中存放着表切分region的信息。HBase 0.98以后,-ROOT-表被移除,直接将.Meta表region位置信息存放在Zookeeper中。Meta表更名为hbase:meta,部分内容如下:

hbase(main):021:0> scan 'hbase:meta'

ROW COLUMN+CELL

crawler_data,,1434369403755.1cd1e7575017ba6d column=info:regioninfo, timestamp=1434369404626, value={ENCODED => 1cd1e7575017ba6d25fe97416f329503, NAME => 'crawler_data,,143436

25fe97416f329503. 9403755.1cd1e7575017ba6d25fe97416f329503.', STARTKEY => '', ENDKEY => '14341050600001033470209693090480'}

crawler_data,,1434369403755.1cd1e7575017ba6d column=info:seqnumDuringOpen, timestamp=1434369404761, value=\x00\x00\x00\x00\x00\x00\x8C9

25fe97416f329503.

crawler_data,,1434369403755.1cd1e7575017ba6d column=info:server, timestamp=1434369404761, value=hdpnode5.devgbg:60020

找到数据对应region托管的RegionServer以后,客户端就和RegionServer交互了。Meta表很好的解决了region定位的问题。

RegionServer读取region数据时,必须重新衔接持久化到硬盘上的HFile和内存中MemStore时的数据。使用BlockCache缓存HFile里读入内存的频繁访问的数据,避免硬盘读。读取时,首先检查MemStore等修改的队列,然后检查BlockCache看包含该行的Block是否最近被访问过,最后访问硬盘上的对应HFile。

HFile物理存放形式是一个Block的序列外加这些Block的索引。Block是建立索引的最小数据单位,也是从硬盘读取的最小数据单位。从HBase里读取一个Block需要先在索引上查找一次该 Block,然后从硬盘读出。Block的大小可以在列族级别设定,默认值是64KB。如果业务场景主要是随机查询,可以把Block调小,生成细粒度的Block索引,提高查询性能,代价是Block索引会消耗更多的内存。如果经常需要使用MR顺序扫描表,一次读取多个Block,大一些Block设置性能更好,同时节省索引内存开销。

存储在硬盘的HFile按Block创建索引,在查询特定的行时,使用Block索引查找应该读取HFile的数据块,效果还是有限的。Block数据块的默认大小是64KB,这个大小也不调整太多。如果查询特定的行,只在整个数据块的起始行键上建立索引粒度还是不够。特定行在Block数据块中的查找方法,HBase还提供了布隆过滤器。布隆过虑器允许对存储在每个数据块的行键做一个反向测试。当某行被请求时,先检查布隆过滤器,看看该行是否不在这个数据块中。HBase提供了行级布隆过滤器和列限定符级布隆过滤器。列限定符级布隆过滤器会增加更多的内存开销。

总结一下,HBase通过切分表、BlockCache,Block索引和布隆过滤器等技术,实现了单表海量数据的毫秒级查询。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Flume、Kafka、Hbase、Hive适用场.. 下一篇Sqoop将SQLServer数据导入HBase

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目