当前位置:首页 > 开发 > 数据库 > 正文

【原创】HBase如何实现海量数据的毫秒级查询

发表于: 2015-07-09   作者:dujian.gu   来源:转载   浏览次数:
摘要: HBase中单表的数据量通常可以达到TB级或PB级,但大多数情况下数据读取可以做到毫秒级。HBase是如何做到的哪?要想实现表中数据的快速访问,通用的做法是数据保持有序并尽可能的将数据保存在内存里。HBase也是这样实现的。   对于海量级的数据,首先要解决存储的问题。   数据存储上,HBase将表切分成小一点的数据单位region,托管到RegionServer上,

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索引和布隆过滤器等技术,实现了单表海量数据的毫秒级查询。

【原创】HBase如何实现海量数据的毫秒级查询

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
计算毫秒级的时间差算是一个常见的需求吧... 手头上是windows编程的项目,所以首先就想到的是GetTic
原文地址:http://www.searchdatabase.com.cn/showcontent_43246.htm  数据分页一直是一个经久不衰
数据分页一直是一个经久不衰的话题,在园子里看到了N多高手,都比我厉害, 今天把我使用的分页代码继续
Verilog实现毫秒级计时器(秒表) 功能描述 使用Verilog语言在Nexys3开发板上实现一个毫秒精度的计时
数据分页一直是一个经久不衰的话题,在园子里看到了N多高手,都比我厉害, 今天把我使用的分页代码继续
数据分页一直是一个经久不衰的话题,在园子里看到了N多高手,都比我厉害, 今天把我使用的分页代码继续
数据分页一直是一个经久不衰的话题,在园子里看到了N多高手,都比我厉害, 今天把我使用的分页代码继续
数据分页一直是一个经久不衰的话题,在园子里看到了N多高手,都比我厉害, 今天把我使用的分页代码继续
from:http://www.nosqlnotes.net/archives/170 我在数据库大会有一个报告:<<Oceanbase – 千
from:http://www.nosqlnotes.net/archives/170 我在数据库大会有一个报告:<<Oceanbase – 千
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号