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的海量数据的实实时查询系统的原理分析。详细的介绍了大数据查询的原理。
海量图片的存储是通过HBase实现的,HBase是一种面向列的NoSQL数据库,特别适合存储海量数据。 一、直接上传本地栅格数据将导致的问题 栅格数据的特点是每层的图片个数都为上层数量的四倍。在第20层时,仅仅第20层...
6. 列族与行键设计: HBase中数据的组织方式是基于列族和行键的设计,这有助于实现数据的合理分布和高效查询。列族可以存储具有相同特性的数据,而行键结构设计是实现快速查询的关键。在设计行键结构时,可以结合车...
基于MapReduce和HBase的海量网络数据处理 ...本文提出了一种基于MapReduce和HBase的海量网络数据处理系统,可以实现对海量网络数据的高效处理和分析,为大数据时代的网络数据处理提供了一种良好的解决方案。
手把手视频详细讲解项目开发全过程,需要的小伙伴...7. 基于Phoenix消息数据查询 第三章 HBase高级 1. 重要工作机制 2. HBase批量装载——Bulk load 3. HBase的协处理器(Coprocessor) 4. HBase事务 5. HBase数据结构
本文提出并实现了一套基于HBase的海量数据分布式序列存储方案,旨在优化存储性能,并提高系统的扩展性。 要理解本文提出的优化策略,首先需要了解HBase的基本概念和数据模型。HBase的表可以看作一个多维映射表,...
HBase分页查询实现 HBase作为一个NoSQL数据库,具有高性能、高可扩展性和高可靠性等特点,但是在查询方面却存在一些限制,例如不支持分页查询。这就使得开发者需要自己实现分页查询功能。本文将讲解如何使用Java...
### HBase海量数据全量导入方法详解 在大数据领域,HBase作为一款分布式、版本化的宽列存储NoSQL数据库,以其高效的数据读取能力而著称。然而,在面对大规模数据导入时,其compaction机制可能会成为性能瓶颈。本文...
文章通过在HBase集群环境下使用真实GIS数据验证了上述方法,实验结果显示,提出的系统在海量数据存储和检索方面性能卓越,能够实现地理信息数据的高效存储和实时高速检索。 文章中的关键词包括大数据、HBase、栅格...
elasticsearch+hbase海量数据查询,支持千万数据秒回查询 一、ElasticSearch和Hbase ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch...
HBase是一种分布式、基于列族的NoSQL数据库,它在大数据领域中扮演着重要的角色,尤其是在需要实时查询大规模数据集时。HBase以其高吞吐量、低延迟和水平扩展能力而闻名,常用于存储非结构化和半结构化数据。在HBase...
Hbase有着先天的优势和先天的劣势,而劣势就是其较差的数据定位能力,也就是数据查询能力。因为面向列的特点,Hbase只能单单地以rowkey为主键作查询,而无法对表进行多维查询和join操作,并且查询通常都是全表扫描,耗费...
- Region Server的HDFS数据备份:通过复制Region Server上的HDFS数据到其他存储位置,实现数据备份。 3. 数据恢复: - 快照恢复:通过回滚到特定的快照点,可以迅速恢复数据。 - HLog重放:如果丢失了部分HLog,...
HBase的数据模型基于列族,这使得数据的扩展性和查询效率得到了保证。结合Django的后端处理,系统可以实现对大量文献数据的快速存取和分析。 在数据挖掘部分,系统可能利用了各种算法,如TF-IDF、词频统计、关联...
3. 查询功能实现:根据RowKey查询数据是HBase的基本操作,通过输入RowKey,后台执行get操作获取对应行数据,并展示在页面上。 4. 表管理:支持HBase的建表和删除操作,这需要调用HBase的Admin API,完成表的创建、...
HBase分页查询是实现高效数据检索的重要手段。通过使用Java语言和HBase的API,我们可以实现高效的分页查询,提高查询效率和用户体验度。本文提供了一个简单的示例代码,旨在帮助开发者更好地理解HBase分页查询的实现...
这个压缩包文件“findhbase”可能是提供了一系列HBase操作的示例或工具,帮助用户了解如何在实际场景中进行数据查询、获取和删除。 首先,我们来详细讨论HBase的数据模型。行键是表中的唯一标识符,决定了数据的...