美文网首页
RegionServer读请求处理流程

RegionServer读请求处理流程

作者: ryancao_b9b9 | 来源:发表于2020-08-06 17:10 被阅读0次

一、概述

RegionServer接收到客户端的get/scan请求之后,先后做了两件事情:

  1. 数据组织(构建scanner体系)
  2. 数据过滤

二、 数据组织(构建scanner体系)过程

scanner体系的核心在于三层scanner:RegionScanner、StoreScanner以及StoreFileScanner。


scanner体系
  • 一个RegionScanner由多个StoreScanner构成,一张表由多个列族组成,就有多少个StoreScanner负责该列族的数据扫描。
  • 一个StoreScanner又是由多个StoreFileScanner组成。每个Store的数据由内存中的MemStore和磁盘上的StoreFile文件组成,相对应的,StoreScanner对象会雇佣一个MemStoreScanner和N个StoreFileScanner来进行实际的数据读取,
  • 一个StoreFile文件对应一个StoreFileScanner
    注意:StoreFileScanner和MemstoreScanner是整个scan的最终执行者。

这些 scanner 首先根据 scan 的 TimeRange 和 Rowkey Range 会过滤掉一些,剩下的 scanner 在 RegionServer 内部组成一个最小堆 KeyValueHeap,该数据结构核心一个 PriorityQueue 优先级队列,队列里按照 Scanner 指向的 KeyValue 排序。


scanner最小堆构建过程

三、数据过滤过程

假设 HRegion 有4个 Hfile,1个 MemStore,那么最小堆内有4个 scanner 对象,我们以 scannerA-D 来代替这些 scanner 对象, 同时假设我们需要查询的 rowkey 为 rowA。每一个 scanner 内部有一个 current 指针,指向的是当前需要遍历的 KeyValue,所以这时堆顶部的 scanner 对象的 current 指针指向的就是 rowA(rowA:cf:colA)这条数据。通过触发 next() 调用,移动 current 指针,来遍历所有 scanner 中的数据。

  • 第一次 next 请求,将会返回 ScannerA中的rowA:cf:colA,而后 ScannerA 的指针移动到下一个 KeyValue rowA:cf:colB,堆中的 Scanners 排序不变;


    第一次 next 请求-最小堆
  • 第二次 next 请求,返回 ScannerA 中的 rowA:cf:colB,ScannerA 的 current 指针移动到下一个 KeyValue rowB:cf:ColA,因为堆按照 KeyValue 排序可知 rowB 小于 rowA, 所以堆内部,scanner 顺序发生改变,改变之后如下图所示:


    第二次 next 请求-最小堆

scanner 内部数据完全检索之后会 close 掉,或者 rowA 所有数据检索完毕,则查询下一条。默认情况下返回的数据需要经过 ScanQueryMatcher 过滤返回的数据需要满足下面的条件:

keyValue类型为put
列是Scanner指定的列
满足filter过滤条件
最新的版本
未删除的数据
如果 scan 的参数更加复杂,条件也会发生变化,比如指定 scan 返回 Raw 数据的时候,打了删除标记的数据也要被返回。

四、扩展
1、为什么这些Scanner需要由小到大排序?

最合理的解释是只有由小到大排序才能使得scan效率最高。举个简单的例子,HBase支持数据多版本,假设用户只想获取最新版本,那只需要将这些数据由最新到最旧进行排序,然后取队首元素返回就可以。那么,如果不排序,就只能遍历所有元素,查看符不符合用户查询条件。这就是排队的意义。

2、不同KeyValue之间如何进行大小比较?

上文提到KeyValue中Key由RowKey,ColumnFamily,Qualifier ,TimeStamp,KeyType等5部分组成,HBase设定Key大小首先比较RowKey,RowKey越小Key就越小;RowKey如果相同就看CF,CF越小Key越小;CF如果相同看Qualifier,Qualifier越小Key越小;Qualifier如果相同再看Timestamp,Timestamp越大表示时间越新,对应的Key越小。如果Timestamp还相同,就看KeyType,KeyType按照DeleteFamily -> DeleteColumn -> Delete -> Put 顺序依次对应的Key越来越大。

相关文章

  • RegionServer读请求处理流程

    一、概述 RegionServer接收到客户端的get/scan请求之后,先后做了两件事情: 数据组织(构建sca...

  • hbase读写流程

    1.1 写操作流程(1) Client通过Zookeeper的调度,向RegionServer发出写数据请求,在R...

  • Hbase必背面试题

    1,hbase读流程 首先通过meta表找到要读数据的region所在的RegionServer,然后去Block...

  • 【充电】《Nginx核心知识100讲》信号、nginx事件、同步

    极客专栏《Nginx核心知识100讲》20-32小节的笔记 nginx 请求处理流程 1.nginx请求处理流程 ...

  • Future模式

    Future模式 概念 处理流程 传统处理流程 客户端发出call请求,这个请求需要很长一段时间才能返回。客户端一...

  • nginx架构基础

    nginx 请求处理流程 nginx进程结构 nginx 进程管理:信号 reload流程 热升级流程 work进...

  • MySQL查询执行过程

    MYSQL请求处理路径: MySQL请求处理流程: #1.为用户创建、分配处理线程。 #2.登录验证 #3.资源初...

  • 探索 OkHttp 原理

    前言 1. OkHttp 请求处理流程概述 当我们发起同步请求时,请求会被 Dispatcher 放到同步请求队列...

  • Dubbo请求处理流程

    Dubbo客户端发送请求调用栈: Dubbo服务端接受请求图: 介绍下两个概念: 过滤器链 各类协议protoco...

  • Nginx请求处理流程

    官方文档地址:http://nginx.org/en/docs/http/request_processing.h...

网友评论

      本文标题:RegionServer读请求处理流程

      本文链接:https://www.haomeiwen.com/subject/rbqtdktx.html