Hbase查询效率

HBase查询效率揭秘:

(1) Hbase通过rowkey可以快速地位到在那个region上,位置信息保存在hbase的meta表里
每次查询都会有location cache的,所以htable里面的Hconnection 初始化的时候访问速度相对来说稍慢,客户端缓存截图如下。随着数据越来越大,meta表的查询有可能遇到瓶颈,建议单独独立出成一个meta server。

(2) HBase能提供实时计算服务主要原因是由其架构和底层的数据结构决定的,即由LSM-Tree(Log-Structured Merge-Tree) + HTable(region分区) + Cache决定——客户端可以直接定位到要查数据所在的HRegion server服务器,然后直接在服务器的一个region上查找要匹配的数据,并且这些数据部分是经过cache缓存的。

前面说过HBase会将数据保存到内存中,在内存中的数据是有序的,如果内存空间满了,会刷写到HFile中,而在HFile中保存的内容也是有序的。当数据写入HFile后,内存中的数据会被丢弃。

HFile文件为磁盘顺序读取做了优化,按页存储。下图展示了在内存中多个块存储并归并到磁盘的过程,合并写入会产生新的结果块,最终多个块被合并为更大块。

多次刷写后会产生很多小文件,后台线程会合并小文件组成大文件,这样磁盘查找会限制在少数几个数据存储文件中。HBase的写入速度快是因为它其实并不是真的立即写入文件中,而是先写入内存,随后异步刷入HFile。所以在客户端看来,写入速度很快。另外,写入时候将随机写入转换成顺序写,数据写入速度也很稳定。
而读取速度快是因为它使用了LSM树型结构,而不是B或B+树。磁盘的顺序读取速度很快,但是相比而言,寻找磁道的速度就要慢很多。HBase的存储结构导致它需要磁盘寻道时间在可预测范围内,并且读取与所要查询的rowkey连续的任意数量的记录都不会引发额外的寻道开销。比如有5个存储文件,那么最多需要5次磁盘寻道就可以。而关系型数据库,即使有索引,也无法确定磁盘寻道次数。而且,HBase读取首先会在缓存(BlockCache)中查找,它采用了LRU(最近最少使用算法),如果缓存中没找到,会从内存中的MemStore中查找,只有这两个地方都找不到时,才会加载HFile中的内容,而上文也提到了读取HFile速度也会很快,因为节省了寻道开销。

举个例子
A:如果快速查询(从磁盘读数据),hbase是根据rowkey查询的,只要能快速的定位rowkey, 就能实现快速的查询,主要是以下因素:
1、hbase是可划分成多个region,你可以简单的理解为关系型数据库的多个分区。
2、键是排好序了的
3、按列存储的

首先,能快速找到行所在的region(分区),假设表有10亿条记录,占空间1TB, 分列成了500个region, 1个region占2个G. 最多读取2G的记录,就能找到对应记录;

其次,是按列存储的,其实是列族,假设分为3个列族,每个列族就是666M, 如果要查询的东西在其中1个列族上,1个列族包含1个或者多个HStoreFile,假设一个HStoreFile是128M, 该列族包含5个HStoreFile在磁盘上. 剩下的在内存中。

再次,是排好序了的,你要的记录有可能在最前面,也有可能在最后面,假设在中间,我们只需遍历2.5个HStoreFile共300M

最后,每个HStoreFile(HFile的封装),是以键值对(key-value)方式存储,只要遍历一个个数据块中的key的位置,并判断符合条件可以了。 一般key是有限的长度,假设跟value是1:19(忽略HFile上其它块),最终只需要15M就可获取的对应的记录,按照磁盘的访问100M/S,只需0.15秒。 加上块缓存机制(LRU原则),会取得更高的效率。

B:实时查询
实时查询,可以认为是从内存中查询,一般响应时间在1秒内。HBase的机制是数据先写入到内存中,当数据量达到一定的量(如128M),再写入磁盘中, 在内存中,是不进行数据的更新或合并操作的,只增加数据,这使得用户的写操作只要进入内存中就可以立即返回,保证了HBase I/O的高性能。

实时查询,即反应根据当前时间的数据,可以认为这些数据始终是在内存的,保证了数据的实时响应。

<think>好的,用户想了解HBase查询语法和使用示例。首先,我需要回忆HBase的基本结构和查询方式。HBase是基于列族的NoSQL数据库,主要使用Shell命令和Java API进行操作。用户提到的HBase Shell是交互式工具,应该从这里入手。 用户需要查询语法,特别是示例。HBase查询主要用scan和get命令。scan用于扫描表,而get获取特定行。需要详细说明这两个命令的参数,比如LIMIT、STARTROW、FILTER等。 记得用户可能不太熟悉过滤器,需要举例说明,比如RowFilter、ValueFilter等。还要注意HBase Shell的基本操作步骤,比如禁用表、启用表等,可能影响查询效率。 需要检查是否有遗漏的常用命令,比如count统计行数。同时,确保示例代码正确,语法正确,比如使用正确的引号和格式。注意用户提供的引用,引用[1]提到HBase Shell的功能,可以引用作为基础。引用[2]虽然关于Hive,但可能用户混淆,需明确区分。 最后,生成相关问题时要围绕HBase查询的深入使用、性能优化、与其他数据库的区别等,帮助用户扩展知识。确保回答结构清晰,分步骤讲解,符合用户要求的格式,特别是行内公式用$,独立公式用$$,但这里可能用不到数学公式,需注意。</think>### HBase 查询语法及使用示例 HBase 查询主要通过 `scan` 和 `get` 命令实现,支持条件过滤、行键范围查询等操作。以下是核心语法和示例: --- #### 1. **基础查询** - **`scan` 命令**:扫描表数据,默认返回全部记录。 ```bash scan '表名' ``` - **`get` 命令**:获取指定行键的数据。 ```bash get '表名', '行键' ``` **示例**: ```bash # 创建表 create 'student', 'info', 'score' # 插入数据 put 'student', '001', 'info:name', 'Alice' put 'student', '001', 'score:math', '95' put 'student', '002', 'info:name', 'Bob' put 'student', '002', 'score:math', '88' # 查询所有数据 scan 'student' # 查询指定行 get 'student', '001' ``` --- #### 2. **条件过滤** 通过 `FILTER` 参数实现复杂查询,支持行键、列值、时间戳等过滤。 **常用过滤器**: - `RowFilter`:按行键过滤(例如前缀匹配) - `ValueFilter`:按列值过滤 - `SingleColumnValueFilter`:按指定列的值过滤 **示例**: ```bash # 查询行键以 "00" 开头的记录 scan 'student', {FILTER => "RowFilter(=, 'prefix:00')"} # 查询数学成绩大于 90 的学生 scan 'student', {FILTER => "SingleColumnValueFilter('score', 'math', >, 'binary:90')"} ``` --- #### 3. **范围查询** 通过 `STARTROW` 和 `STOPROW` 限定行键范围。 ```bash # 查询行键从 "001" 到 "002" 的数据 scan 'student', {STARTROW => '001', STOPROW => '003'} ``` --- #### 4. **列限定查询** 通过 `COLUMNS` 指定返回的列族或列。 ```bash # 仅返回 "info:name" 列 scan 'student', {COLUMNS => 'info:name'} ``` --- #### 5. **性能优化参数** - `LIMIT`:限制返回行数 - `CACHE`:调整缓存大小提升扫描速度 **示例**: ```bash # 返回前 10 条数据 scan 'student', {LIMIT => 10} # 设置缓存大小为 1000 行 scan 'student', {CACHE => 1000} ``` --- #### 6. **统计行数** 使用 `count` 命令统计表的总行数(需先禁用表)。 ```bash disable 'student' count 'student' enable 'student' ``` --- ### 引用说明 HBase Shell 通过命令行提供灵活的查询能力,支持行键过滤、列值匹配等操作[^1]。复杂查询需结合过滤器语法实现,性能调优可调整 `CACHE` 或 `LIMIT` 参数[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值