Hbase的二级索引和RowKey的设计

简介: Hbase的二级索引和RowKey的设计

Hbase查询简介

Hbase查询的时候,有以下几种方式:

• 通过 rowkey方式,指定 获取唯一记录

• 通过 scan方式,设置satrtRow 和stopRow 参数进行范围匹配(模糊查询)

• 全表扫描,即直接扫描整张表中所有行记录

HBase里面只有rowkey作为一级索引

Hbase的scan,不走主键索引,而是全表扫描,性能奇差。

为了HBase的数据查询更高效、适应更多的场景, 诸如使用非rowkey字段检索也能做到秒级响应,或者支持各个字段进行模糊查询和多字段组合查询等, 因此需要在HBase上面构建二级索引, 以满足现实中更复杂多样的业务需求。

二级索引方案

基于Coprocessor方案

原理:基于Coprocessor(0.92版本开始引入,达到支持类似传统RDBMS的触发器的行为)开发自定义数据处理逻辑,采用数据“双写”(dual-write)策略,在有数据写入同时同步到二级索引表

关键部分来了, 既然Hbase并没有提供二级索引,那如何实现呢?先看下面这张图

Coprocessor

我们的需求是找出满足cf1:col2=c22这条记录的cf1:col1的值,实现方法如图,首先根据cf1:col2=c22查找到该记录的行键,然后再通过行健找到对应的cf1:col1的值。其中第二步是很容易实现的,因为Hbase的行键是有索引的,那关键就是第一步,如何通过cf1:col2的值找到它对应的行键。很容易想到建立cf1:col2的映射关系,即将它们提取出来单独放在一张索引表中,原表的值作为索引表的行键,原表的行键作为索引表的值,这就是Hbase的倒排索引的思想。

开源方案

1、华为的hindex:当年刚出来的时候比较火,但是版本较旧,看GitHub项目地址最近这几年就没更新过

2、Apache的phoenix:在目前开源的方案中,是一个比较优的选择。主打SQL on HBase , 基于SQL能完成HBase的CRUD操作,支持JDBC协议

优点: 基于Coprocessor的方案,从开发设计的角度看, 把很多对二级索引管理的细节都封装在的Coprocessor具体实现类里面, 这些细节对外面读写的人是无感知的,简化了数据访问者的使用。

缺点: 但是Coprocessor的方案入侵性比较强, 增加了在Regionserver内部需要运行和维护二级索引关系表的代码逻辑等,对Regionserver的性能会有一定影响

非Coprocessor方案

常见的是采用底层基于Apache Lucene的Elasticsearch(下面简称ES)或Apache Solr ,来构建强大的索引能力、搜索能力, 例如支持模糊查询、全文检索、组合查询、排序等。

1、Lily HBase Indexer:

Lily HBase Indexer(也简称 HBase Indexer)是国外的NGDATA公司开源的基于solr的索引构建工具, 特色是其基于HBase的备份机制,开发了一个叫SEP工具, 通过监控HBase 的WAL日志(Put/Delete操作),来触发对solr集群索引的异步更新, 基本对HBase无侵入性(但必须开启WAL )

2、CDHSearch

CDHSearch是Hadoop发行商Cloudera公司开发的基于solr的HBase检索方案,部分集成了Lily HBase Indexer的功能。

3、 DataStory

有自己的大数据团队的公司一般都会针对自己的业务场景进行优化,自行构建ES/Solr的搜索集群。 例如数说故事企业内部的百亿级数据全量库,就是基于ES构建海量索引和检索能力的案例。 主要优化点包括:

对企业的索引集群面向的业务场景和模式定制,对通用数据模型进行抽象和平台化复用需要针对多业务、多项目场景进行ES集群资源的合理划分和运维管理查询需要针对多索引集群、跨集群查询进行优化共用集群场景需要做好防护、监控、限流

增量索引: 日常持续接入的数据源,进行增量的索引更新

全量索引: 配套基于Spark/MR的批量索引创建/更新程序, 用于初次或重建已有HBase库表的索引

数据查询流程:

Datastory在做全量库的过程中,还是有更多遇到的问题要解决,诸如数据一致性、大量小索引、多版本ES集群共存等

RowKey的设计

如果我们RowKey设计为uid+phone+name,那么这种设计可以很好的支持一下的场景:

uid=873969725 AND phone=18900000000 AND name=zhangsan
uid= 873969725 AND phone=18900000000
uid= 873969725 AND phone=189?
uid= 873969725

难以支持的场景:

phone=18900000000 AND name = zhangsan
phone=18900000000 
name=zhangsan

RowKey设计案例剖析

1. 查询某用户在某应用中的操作记录

reverse(userid) + appid + timestamp

2. 查询某用户在某应用中的操作记录(优先展现最近的数据)

reverse(userid) + appid + (Long.Max_Value - timestamp)

3. 查询某用户在某段时间内所有应用的操作记录

reverse(userid) + timestamp + appid

4. 查询某用户的基本信息

reverse(userid)

5. 查询某eventid记录信息

salt + eventid + timestamp

如果 userid是按数字递增的,并且长度不一,可以先预估 userid 最大长度,然后将userid进行翻转,再在翻转之后的字符串后面补0(至最大长度);如果长度固定,直接进行翻转即可(如手机号码)。

在第5个例子中,加盐的目的是为了增加查询的并发性,加入Slat的范围是0~n,可以将数据分为n个split同时做scan操作,有利于提高查询效率。

RowKey设计原则总结

在HBase的使用过程,设计RowKey是一个很重要的一个环节。我们在进行RowKey设计的时候可参照如下步骤:

  1. 结合业务场景特点,选择合适的字段来做为RowKey,并且按照查询频次来放置字段顺序
  2. 通过设计的RowKey能尽可能的将数据打散到整个集群中,均衡负载,避免热点问题
  3. 设计的RowKey应尽量简短

拓展阅读

解密OpenTSDB的表存储优化-阿里云开发者社区

OpenTSDB简介_击水三千里的博客-CSDN博客

参考文章

HBase二级索引方案_沧海一粟的博客-CSDN博客_hbase二级索引

一篇文章带你快速搞懂HBase RowKey设计 - 知乎

Hbase构建二级索引的一些解决方案


相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
存储 NoSQL 分布式数据库
Hbase的三种索引_全局索引,覆盖索引,本地索引(七)
Hbase的三种索引_全局索引,覆盖索引,本地索引(七)
171 0
|
6月前
|
SQL 分布式数据库 HIVE
Hbase二级索引_Hive on Hbase 及phoenix详解
Hbase二级索引_Hive on Hbase 及phoenix详解
77 0
|
分布式数据库 索引 Hbase
《HBase应用与发展之HBase RowKey与索引设计》电子版地址
HBase应用与发展之HBase RowKey与索引设计
122 0
《HBase应用与发展之HBase RowKey与索引设计》电子版地址
|
分布式数据库 Hbase
|
存储 缓存 负载均衡
Hbase的Rowkey设计以及如何进行预分区
今天有人问我Hbase的rowkey设计和预分区的问题,这篇文字就简单介绍一下.,关于Hbase的表的一些基本概念这里就不说了,直接说重点,尽可能说的简单一点,废话就不写了. 1.什么是Rowkey? 我们知道Hbase是一个分布式的、面向列的数据库,它和一般关系型数据库的最大区别是:HBase很适合于存储非结构化的数据,还有就是它基于列的而不是基于行的模式.
Hbase的Rowkey设计以及如何进行预分区
|
分布式计算 Hadoop Linux
云计算集群搭建记录[Hadoop|Zookeeper|Hbase|Spark | Docker]更新索引 |动态更新
为了能够更好的查看所更新的文章,讲该博文设为索引 小约定 为了解决在编辑文件等操作的过程中的权限问题,博主一律默认采用root账户登录 对于初次安装的用户可以采用如下命令行:
139 0
云计算集群搭建记录[Hadoop|Zookeeper|Hbase|Spark | Docker]更新索引 |动态更新
|
存储 缓存 负载均衡
大白话彻底搞懂 HBase Rowkey 设计和实现方式
大白话彻底搞懂 HBase Rowkey 设计和实现方式
828 0
大白话彻底搞懂 HBase Rowkey 设计和实现方式
|
存储 关系型数据库 Java
Hbase入门(四)——表结构设计-RowKey
Hbase的表结构设计与关系型数据库有很多不同,主要是Hbase有Rowkey和列族、timestamp这几个全新的概念,如何设计表结构就非常的重要。
764 0
Hbase入门(四)——表结构设计-RowKey
|
存储 缓存 Oracle
Hbase rowkey设计原则,热点问题
Hbase rowkey设计原则,热点问题
|
2月前
|
分布式计算 Java Hadoop
java使用hbase、hadoop报错举例
java使用hbase、hadoop报错举例
90 4