五分钟学会HBase二级索引的设计

一、原理
“二级多列索引”是针对目标记录的某个或某些列建立的“键-值”数据,以列的值为键,以记录的RowKey为值,当以这些列为条件进行查询时,引擎可以通过检索相应的“键-值”数据快速找到目标记录。由于HBase本身并没有索引机制,为了确保非侵入性,引擎将索引视为普通数据存放在数据表中,所以,如何解决索引与主数据的划分存储是引擎第一个需要处理的问题,为了能获得最佳的性能表现,我们并没有将主数据和索引分表储存,而是将它们存放在了同一张表里,通过给索引和主数据的RowKey添加特别设计的Hash前缀,实现了在Region切分时,索引能够跟随其主数据划归到同一Region上,即任意Region上的主数据其索引也必定驻留在同一Region上,这样我们就能把从索引抓取目标主数据的性能损失降低到最小。与此同时,特别设计的Hash前缀还在逻辑上把索引与主数据进行了自动的分离,当全体数据按RowKey排序时,排在前面的都是索引,我们称之为索引区,排在后面的均为主数据,我们称之为主数据区。最后,通过给索引和主数据分配不同的Column Family,又在物理存储上把它们隔离了起来。逻辑和物理上的双重隔离避免了将两类数据存放在同一张表里带来的副作用,防止了它们之间的相互干扰,降低了数据维护的复杂性,可以说这是在性能和可维护性上达到的最佳平衡。

二、设计demo

让我们通过一个示例来详细了解一下二级多列索引表的结构,假定有一张Sample表,使用四位数字构成Hash前缀[ii],范围从0000到9999,规划切分100个Region,则100个Region的RowKey区间分别为[0000,0099],[0100,0199],……,[9900,9999],以第一个Region为例,请看图1,所有数据按RowKey进行字典排序,自动分成了索引区和主数据区两段,主数据区的Column Family是d,下辖q1,q2,q3等Qualifier,为了简单起见,我们假定q1,q2,q3的值都是由两位数字组成的字符串,索引区的Column Family是i,它不含任何Qualifier,这是一个典型的“Dummy Column Family“,作为区别于d的另一个Column Family,它的作用就是让索引独立于主数据单独存储。接下来是最重要的部分,即索引和主数据的RowKey,我们先看主数据的RowKey,它由四位Hash前缀和原始ID两部分组成,其中Hash前缀是由引擎分配的一个范围在0000到9999之间的随机值,通过这个随机的Hash前缀可以让主数据均匀地散列到所有的Region上,我们看图1,因为Region 1的RowKey区间是[0000,0099],所以没有任何例外,凡是且必须是前缀从0000到0099的主数据都被分配到了Region 1上。

接下来看索引的RowKey,它的结构要相对复杂一些,格式为:RegionStartKey-索引名-索引键-索引值,与主数据不同,索引RowKey的前缀部分虽然也是由四位数字组成,但却不是随机分配的,而是固定为当前Region的StartKey,这是非常重要而巧妙的设计,一方面,这个值处在Region的RowKey区间之内,它确保了索引必定跟随其主数据被划分到同一个Region里;另一方面,这个值是RowKey区间内的最小值,这保证了在同一Region里所有索引会集中排在主数据之前。接下来的部分是“索引名”,这是引擎给每类索引添加的一个标识,用于区分不同类型的索引,图1中展示了两种索引:a和b,索引a是为字段q1和q2设计的两列联合索引,索引b是为字段q2和q3设计的两列联合索引,依次类推,我们可以根据需要设计任意多列的联合索引。再接下来就是索引的键和值了,索引键是由目标记录各对应字段的值组成,而索引值就是这条记录的RowKey。

现在,假定需要查询满足条件q1=01 and q2=02的Sample记录,分析查询字段和索引匹配情况可知应使用索引a,也就是说我们首先确定了索引名,于是在Region 1上进行scan的区间将从主数据全集收窄至[0000-a, 0000-b),接着拼接查询字段的值,我们得到了索引键:0102,scan区间又进一步收窄为[0000-a-0102, 0000-a-0103),于是我们可以很快地找到0000-a-0102-0000|63af51b2这条索引,进而得到了索引值,也就是目标数据的RowKey:0000|63af51b2,通过在Region内执行Get操作,最终得到了目标数据。需要特别说明的是这个Get操作是在本Region上执行的,这和通过HTable发出的Get有很大的不同,它专门用于获取Region的本地数据,其执行效率是非常高的,这也是为什么我们一定要将索引和它的主数据放在同一张表的同一个Region上的原因。

预分区示例

byte prefix =(byte) (Long.hashCode(timestamp) % <number of regionservers>);
byte[] rowkey =Bytes.add(Bytes.toBytes(prefix), Bytes.toBytes(timestamp);

原文出自:HBase高性能复杂条件查询引擎
更多资料:HBase二级索引的设计

HBase二级索引的设计原理及简单设计demo相关推荐

  1. hbase组合rowkey_「从零单排HBase 11」HBase二级索引解决方案

    HBase一个令人惋惜的地方,就是不支持二级索引.因此,社区有了很多补充方案来填补HBase的二级索引能力的缺陷. 今天,我们就来看看有哪些二级索引方案,通过对比各个方案的优缺点,并结合我们的具体场景 ...

  2. 基于ES的HBase二级索引方案

    HBase不支持多条件查询,不提供二级索引,难以满足用户对检索功能多样性和高效率两方面的需求.由索引模块的需求分析可知,本文解决通过,提出数据与索引的分离,利用HBase数据库的存储模式灵活多变,容纳 ...

  3. 使用solr构建hbase二级索引

    使用solr构建hbase二级索引 @(HBASE)[hbase, solr] 使用solr构建hbase二级索引 一概述 一业务场景描述 二技术方案 1技术方案一 2技术方案二 3关于索引的建议 二 ...

  4. CDH 6 安装 Hbase 二级索引 Solr + Key-Value Store Indexer

    目录 一.集群安装Solr +  Key-Value Store Indexer 二.创建Hbase二级索引 1.更改表结构,允许复制 2.创建相应的SolrCloud集合 3.创建 collecti ...

  5. 基于Solr的Hbase二级索引

    关于Hbase二级索引 HBase 是一个列存数据库,每行数据只有一个主键RowKey,无法依据指定列的数据进行检索.查询时需要通过RowKey进行检索,然后查看指定列的数据是什么,效率低下.在实际应 ...

  6. 【2021软件创新实验室暑假集训】SpringMVC框架(设计原理、简单使用、源码探究)

    系列文章目录 20级 Java篇 [2021软件创新实验室暑假集训]计算机的起源与大致原理 [2021软件创新实验室暑假集训]Java基础(一) [2021软件创新实验室暑假集训]Java基础(二) ...

  7. 华为HBase 二级索引调研

    1.Overall Solution 解决思想: 一个user table对应一个index table index的创建与更新全部在RS端的cp-processor里实现 核心思想:一个actual ...

  8. HBase二级索引的设计与应用(详解)

    最近面试,涉及到了HBase的多条件组合查询,数据存储用的是HBase,恰恰HBase对于这种场景的查询特别不给力,一般HBase的查询都是通过RowKey(要把多条件组合查询的字段都拼接在RowKe ...

  9. (转)HBase二级索引与Join

    二级索引与索引Join是Online业务系统要求存储引擎提供的基本特性.RDBMS支持得比较好,NOSQL阵营也在摸索着符合自身特点的最佳解决方案. 这篇文章会以HBase做为对象来探讨如何基于Hba ...

  10. 阿里云EMR异步构建云HBase二级索引

    一.非HA EMR构建二级索引 云HBase借助Phoenix实现二级索引功能,对于Phoenix二级索引的详细介绍可参考https://yq.aliyun.com/articles/536850?s ...

最新文章

  1. lumen mysql 事务_简单几部搞定laravel/lumen跨库操作
  2. Fedora 34 Beta发布:引入GNOME 40巨大桌面升级
  3. java标识符的规则等
  4. Nexus学习笔记 -- 安装到运行
  5. jboss linux 性能,搭建jprofiler对jboss性能监控
  6. python数据预处理_Python数据预处理——缺失值、重复值
  7. 用css实现文本不换行切超出限制时显示省略号(小tips)
  8. Android完美适配dimens.xml脚本
  9. php花店会员信息管理系统,PHP网上花店管理系统
  10. Vue2.0+组件库总结
  11. 新一代智能会议中控系统
  12. 实战Nagios网络监控(2)—— Nagios+Nrpe监控其他主机
  13. Redis集群cluster:增加删除(伸缩)节点操作步骤
  14. uva10056(概率+等比求和)
  15. CDA I级学习 - 漏斗模型
  16. “甜野男孩”——丁真
  17. 1.CND技术详解---引言
  18. 笔记本WIN7建立共享wifi的简单方法
  19. 关于更新win11后校园网卡顿问题(WLAN上网)
  20. 【 随笔 】 为什么要写技术文章

热门文章

  1. FineUI 后台Grid中 某列添加背景色 AspCore MVC
  2. Zookeeper数据同步流程
  3. 微信公众号开发(一)配置服务器
  4. 7、Lctech Pi(F1C200S)开启RNDIS,通过USB与电脑联网(CherryPi,Mangopi,F1C100S)
  5. 第74句Lies, Damned Lies And Statistics: How Bad Statistics Are Feeding Fake News
  6. PTC Creo 8最新版下载
  7. 福昕阅读器 自定义注释快捷键
  8. matlab 图例legend中实现换行
  9. 网课脚本教程 【基础】(2) 脚本制作规范
  10. Steam[ASF]挂卡(挂游戏时间)纯新手教学