本文分享自华为云社区《MRS HBase全局二级索引原理与使用场景》,作者:学习一下大数据 。

一、HBase二级索引背景介绍

HBase是基于Key-Value的分布式存储数据库,对表中的数据按照rowkey的字典进行排序;当已知要查询的数据rowkey或其范围,可以快速查找到需要读取的数据;HBase提供Filter功能来查询具有特定列值的数据,当无法确定rowkey范围时,条件查询会劣化为全表查询,表数据量较大的场景下,查询容易超时,无法满足查询时延要求。

与结构化数据库(例如MySQL)相似,HBase二级索引就是为了提升此类条件查询场景性能:查询条件无法精确/模糊匹配rowkey(类似于DB主键),同时严格要求查询时延。

二、MRS HBase二级索引原理

用户可以将定义经常查询的列定义为索引列,通过冗余存储索引列数据以达到加速查询的效果,将时间不可控的全表条件查询转换为区间条件查询,从而做到查询低时延。

MRS提供两种HBase二级索引:本地索引(HIndex)和 全局索引(GSI);两者的区别是:

  • 索引数据存储方式:本地索引存储索引数据到用户表的一个单独的列族中,全局索引存储到一个索引表中(索引数据独立存储)。
  • 写入流程:本地索引一次性写入用户数据和索引数据,全局索引需要先后写入索引表和数据表。
  • 读取流程:本地索引需要读取所有region的索引+用户数据,全局索引读取索引表(覆盖查询列场景下,不经过数据表)或索引表+数据表。

MRS 3.x版本提供了HBase全局索引能力,相较于本地索引,具有的优势有:

  • 索引数据独立存储,解耦用户数据,稳定性更优。
  • 索引查询链路优化,支持覆盖列(支持全覆盖),可以将经常查询的非索引列冗余存储到索引表,避免从原表获取数据,同时减少了查询过程中内部的RPC操作,在大规模数据场景下,查询性能更优。

此外,全局索引还提供以下工具,用于索引的维护:

  • 索引创建/删除/状态修改工具
  • 索引数据批量构建工具
  • 索引数据一致性校验工具

三、MRS 全局二级索引使用场景

全局二级索引适用于以下场景:

  • 经常使用固定条件(非rowkey)查询
  • 查询时延有严格要求
  • 用户表的数据量较大(region数量较多)
  • 读多写少,对写入时延无严格要求(为保障索引数据一致性,全局索引采用分阶段式写入的方式,写入时延会有一定上升)

全局二级索引同时需要考虑,预留足够存储空间给索引表,索引数量/覆盖列/索引列越多,需要的空间越大,极限场景(全覆盖)下,与数据表大小相当。

四、MRS HBase全局二级设计与实战

基于HBase全局二级索引查询时,并非所有查询都能命中索引进行加速(HBase全局二级索引的使用规范详见用户手册),想要利用好索引功能,必须根据查询条件设计好索引。

以下实例展示了城市地点人流量统计功能实现,包括索引设计、查询条件等。

数据表定义

create 'city','cf',{SPLITS=>['0','1','2','3','4','5']}

rowkey定义:数据id(随机数字id,用于离散数据)

索引定义

索引名:idx_vn_time

索引字段:cf:visitors_nums+cf:time

覆盖列:全覆盖

该索引用于筛选人流量较大的地区信息

数据表查询对比

预置数据:10MB,预分区11个region,HBase集群节点3个

查询条件1:查询人流量大于9000的地区信息

scan 'city',{COLUMN=>'cf', FILTER=>"SingleColumnValueFilter('cf','visitors_nums',>=,'binary:9000')"}

禁用索引后再次查询

查询条件2:查询2021-01-10 0点-12点,人流量大于9000的地区信息

scan 'city',{COLUMN=>'cf', FILTER=>"SingleColumnValueFilter('cf','visitors_nums',>=,'binary:9000') AND SingleColumnValueFilter('cf','time',>=,'binary:1610208000000') AND SingleColumnValueFilter('cf','time',<,'binary:1610251200000')"}

禁用索引后再次查询

可以看到,命中索引时,查询效率提升十分明显,即使在小表上,也能获得数倍的性能提升。

注:命中索引后的查询结果按索引定义排序

点击关注,第一时间了解华为云新鲜技术~

详解MRS HBase全局二级索引的更多相关文章

  1. HBase详解(05) - HBase优化 整合Phoenix 集成Hive

    HBase详解(05) - HBase优化 整合Phoenix 集成Hive HBase优化 预分区 每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维 ...

  2. HBase的二级索引,以及phoenix的安装(需再做一次)

    一:HBase的二级索引 1.讲解 uid+ts 11111_20161126111111:查询某一uid的某一个时间段内的数据 查询某一时间段内所有用户的数据:按照时间 索引表 rowkey:ts+ ...

  3. 085 HBase的二级索引,以及phoenix的安装(需再做一次)

    一:问题由来 1.举例 有A列与B列,分别是年龄与姓名. 如果想通过年龄查询姓名. 正常的检索是通过rowkey进行检索. 根据年龄查询rowkey,然后根据rowkey进行查找姓名. 这样的效率不高 ...

  4. HBase建立二级索引的一些解决方式

    HBase的一级索引就是rowkey,我们仅仅能通过rowkey进行检索. 假设我们相对hbase里面列族的列列进行一些组合查询.就须要採用HBase的二级索引方案来进行多条件的查询. 常见的二级索引 ...

  5. HBase详解(04) - HBase Java API使用

    HBase详解(04) - HBase Java API使用 环境准备 新建Maven项目,在pom.xml中添加依赖 <dependency> <groupId>org.ap ...

  6. 大数据学习day11------hbase_day01----1. zk的监控机制,2动态感知服务上下线案例 3.HDFS-HA的高可用基本的工作原理 4. HDFS-HA的配置详解 5. HBASE(简介,安装,shell客户端,java客户端)

    1. ZK的监控机制 1.1 监听数据的变化  (1)监听一次 public class ChangeDataWacher { public static void main(String[] arg ...

  7. 基于Solr实现HBase的二级索引

    文章来源:http://www.open-open.com/lib/view/open1421501717312.html 实现目的: 由于hbase基于行健有序存储,在查询时使用行健十分高效,然后想 ...

  8. hbase coprocessor 二级索引

    Coprocessor方式二级索引 1. Coprocessor提供了一种机制可以让开发者直接在RegionServer上运行自定义代码来管理数据.通常我们使用get或者scan来从Hbase中获取数 ...

  9. elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)

    一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...

  10. [How to] MapReduce on HBase ----- 简单二级索引的实现

    1.简介 MapReduce计算框架是二代hadoop的YARN一部分,能够提供大数据量的平行批处理.MR只提供了基本的计算方法,之所以能够使用在不用的数据格式上包括HBase表上是因为特定格式上的数 ...

随机推荐

  1. nginx中一个请求匹配到多个location时的优先级问题,马失前蹄了

    背景 为什么讲这么小的一个问题呢?因为今天在进行系统上线的时候遇到了这个问题. 这次的上线动作还是比较大的,由于组织架构拆分,某个接入层服务需要在两个部门各自独立部署,以避免频繁的跨部门沟通,提升该接 ...

  2. King's Tour 题解

    King's Tour 题面大意 在 \(n\times m\) 的网格中构造一种从 \((1,1)\) 走到 \((a,b)\) 的方案,要求经过所有格子恰好一次,格子之间八联通. 思路分析 模拟赛 ...

  3. Regions 题解

    Regions 这里提供一种时间复杂度不那么优秀但十分好写也好理解的做法. 题目大意 给定一颗 \(n\) 个节点的树,每个节点拥有一个颜色,进行若干次询问,每次询问给出两种颜色 \(A,B\),求所 ...

  4. 单个Nginx发布多个react静态页面

    在有些网络环境中,端口是一种比较稀缺的资源,而我们又恰好有多个前端项目需要发布,我们可以采取将多个项目映射到同一个端口上面的方案加以解决. 本教程前端项目主要以react为主,部署在linux服务器上 ...

  5. 基于C# Socket实现的简单的Redis客户端

    前言 Redis是一款强大的高性能键值存储数据库,也是目前NOSQL中最流行比较流行的一款数据库,它在广泛的应用场景中扮演着至关重要的角色,包括但不限于缓存.消息队列.会话存储等.在本文中,我们将介绍 ...

  6. python列表排序之sort(),sorted()和reverse()

    sort() 正序 sort()可以按字母的顺序来对列表进行永久性排序(改变列表自身的排序): list_1 = ['one', 'two', 'three', 'four', 'five'] pri ...

  7. 报错:bs4.FeatureNotFound: Couldn't find a tree builder with the features you requ

    安装 pip3 install lxml 即可

  8. 文心一言 VS 讯飞星火 VS chatgpt (160)-- 算法导论12.4 2题

    二.用go语言,请描述这样一棵有 n 个结点的二叉搜索树,其树中结点的平均深度为 O(lgn),但这棵树的高度是w(lgn).一棵有 n个结点的二叉搜索树中结点的平均深度为 O(lgn),给出这棵树高 ...

  9. NetSuite 开发日记:创建 Transfer(转账单)

    经测试,截止到 2022.12.26,Transfer 只能使用 Client 脚本创建,使用服务端脚本创建报错:ReferenceError: "document" is not ...

  10. 当一名阿里P9是什么样的体验?

    今天斗胆来跟大家分享一下作为一位阿里的P9是什么样的体验? 首先还是简单给大家介绍一下阿里的p9是属于一个什么样的层级?阿里p9中文名称叫做资深技术专家,一般大概带的团队有从几十人到一两百号人不等,具 ...