HBase一个令人惋惜的地方,就是不支持二级索引。因此,社区有了很多补充方案来填补HBase的二级索引能力的缺陷。

今天,我们就来看看有哪些二级索引方案,通过对比各个方案的优缺点,并结合我们的具体场景做出二级索引方案选型。

1.为什么需要二级索引

HBase系统单纯从解决大数据实时读写问题角度出发,重点关注于分布式存储的扩展性、容错性、读写性能等方面,为此也牺牲了很多传统关系型数据库的功能,比如事务,SQL表达与分析等。

实际上,这是NoSQL最初的含义,以解决大数据的实时存取为首要目标,提供简单的Get,Put,Scan接口,解决用户的大数据量存储的需求。因此,HBase完全是一个非常优秀的大数据实时存取引擎,解决了传统数据库的容量问题。

就目前官方的HBase系统来说,并不支持二级索引,只有rowkey作为一级索引, 如果要对库里的非rowkey字段进行数据检索和查询, 往往要通过MapReduce/Spark等分布式计算框架进行,硬件资源消耗和时间延迟都会比较高。

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

  • 基于HBase的Coprocessor的方案(典型代表phoenix)
  • 云厂商自研的二级索引(阿里云目前有自研增强版二级索引)
  • 基于搜索平台的索引方案(如solr、ES等)。

2.如何选择二级索引方案

我们从读写性能、使用限制、学习成本、社区活跃等角度,对三类方案做对比。

基于HBase的Coprocessor的方案(典型代表phoenix)

  • 官方文档:http://phoenix.apache.org/secondary_indexing.html
  • 读写性能:有一定读写性能损害,索引越多,写入性能影响越大
  • TTL功能:支持比较好
  • 索引的使用限制:一个表的索引数不要超过10个
  • 索引类型:全局索引、本地索引、覆盖索引
  • 学习成本:类JDBC的sql语法,多参考官方的语法(http://phoenix.apache.org/language/index.html)
  • 开源/社区活跃程度:开源,目前社区不太活跃
  • 优点:社区文档多、使用简单、实时查询无延迟
  • 缺点:非商业化方案,没有专门的技术支持

云厂商自研的二级索引(典型代表阿里云自研增强版二级索引)

  • 官方文档:https://help.aliyun.com/document_detail/144577.html?spm=a2c4g.11174283.6.576.4999363f2uZWt0
  • 读写性能:二级索引内置于HBase,官方的性能评测文档说比Phoenix好
  • TTL功能:只能在单列索引上生效
  • 索引的使用限制:一个表的索引个数最多不超过5个、组合索引的列最多不要超过3个
  • 索引类型:全局索引、本地索引、覆盖索引
  • 学习成本:内部封装的很简单,在使用上就是HBase的原生用法
  • 开源/社区活跃程度:非开源、阿里云私有
  • 优点:性能好、实时查询无延迟
  • 缺点:被云厂商锁定

基于搜索平台的二级索引方案(以Solr为例)

  • 官方文档:http://phoenix.apache.org/secondary_indexing.html
  • 读写性能:有一定读写性能损害、数据同步的延迟需要考虑
  • TTL功能:HBase是单个KV过期,而Solr中只能按照Document(对应HBase的一行)过期,过期的时间不完全一致
  • 索引的使用限制:没有限制,完全取决于solr
  • 索引类型:非常灵活
  • 学习成本:需要熟悉solr语法
  • 开源/社区活跃程度:开源 社区活跃
  • 优点:查询方式更加灵活
  • 缺点:引入搜索引擎组件、太重了,而且有明显的延迟问题

总结一下(特别重要的技术选型策略):

  • 为了不被云厂商锁定,所以不采用云厂商独有的二级索引方案
  • 对于实时性要求高、索引数量少的场景,完全可以使用phoenix,简单而又丝滑
  • 对于实时性要求不高、搜索场景比较复杂的,需要引入搜索引擎,如solr或者es进行索引构建

一般来说,为了满足实时需求,我们会使用phoenix。

3.简单了解下phoenix

为了让HBase更强大,更好用,门槛更低,让HBase帮助更多的用户解决他们遇到的实际问题。于是,phoenix带着SQL诞生了。众所周知,SQL是数据处理领域的语言标准,简单,好用,表达力强,用户使用广泛。当然,HBase SQL的实现和发展跟传统单机数据库有很多不同,便于区别,我们称之为NewSQL。这也是社区尝试HBase二级索引的初衷,如果说HBase是功能强大的存储引擎,那么支持NewSQL之后,就变成了新一代的大飞机。

Phoenix作为应用层和HBASE之间的中间件,以下特性使它在大数据量的简单查询场景有着独有的优势

  • 二级索引支持(global index + local index)
  • 编译SQL成为原生HBASE的可并行执行的scan
  • 在数据层完成计算,server端的coprocessor执行聚合
  • 下推where过滤条件到server端的scan filter上
  • skip scan功能提高扫描速度

下一期,我们将结合实践,来说明phoenix的原理和最佳实践,敬请期待!

都看到最后了,原创不易,点个关注,点个赞吧~
知识碎片重新梳理,构建Java知识图谱:https://github.com/saigu/JavaKnowledgeGraph(历史文章查阅非常方便)

hbase组合rowkey_「从零单排HBase 11」HBase二级索引解决方案相关推荐

  1. 「从零单排canal 02」canal集群版 + admin控制台 最新搭建姿势(基于1.1.4版本)

    canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费.应该是阿里云DTS(Data Transfer Service)的开 ...

  2. 「从零单排canal 04」 启动模块deployer源码解析

    本文将对canal的启动模块deployer进行分析. Deployer模块(绿色部分)在整个系统中的角色如下图所示,用来启动canal-server. 模块内的类如下: 为了能带着目的看源码,以几个 ...

  3. 「从零单排canal 01」 canal 10分钟入门(基于1.1.4版本)

    1.简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费.应该是阿里云DTS(Data Transfer Servi ...

  4. 高德地图「海量点标记 + 海量标注」卡顿问题 解决方案

    最近刚做了个和地图相关的需求,涉及到「海量点标记 + 海量标注」.当数据量达到三千以上的时候,「海量标注」会明显拖慢页面的加载/响应速度,非常影响用户体验,因此我对其进行了优化.感觉还挺有挑战性的,在 ...

  5. java hbase 删除数据结构_「从零单排HBase 09」Hbase的那些数据结构和算法

    在之前学习MySQL的时候,我们知道存储引擎常用的索引结构有B+树索引和哈希索引. 而对HBase的学习,也离不开索引结构的学习,它使用了一种LSM树((Log-Structured Merge-Tr ...

  6. hbase查询_【从零单排HBase】HBase高性能查询揭秘

    先给结论吧:HBase利用compaction机制,通过大量的读延迟毛刺和一定的写阻塞,来换取整体上的读取延迟的平稳. 1.为什么要compaction 在上一篇 HBase读写 中我们提到了,HBa ...

  7. 有小数点是什么类型_「JAVA零基础入门系列」Day3 Java基本数据类型

    前两篇已经将开发环境搭建完成,如果你已经按之前的教程按部就班的完成了部署,那么世界上最优秀的编程语言之一和世界上最优秀的IDE之一已经出现在你的电脑上(此处应有掌声),如果你还没入门,或者正在台阶上踱 ...

  8. java数据类型入门程序_「JAVA零基础入门系列」Day3 Java基本数据类型

    前两篇已经将开发环境搭建完成,如果你已经按之前的教程按部就班的完成了部署,那么世界上最优秀的编程语言之一和世界上最优秀的IDE之一已经出现在你的电脑上(此处应有掌声),如果你还没入门,或者正在台阶上踱 ...

  9. api 原生hbase_数据查询的玄铁剑:云HBase原生二级索引发布

    HBase原生提供了主键索引,用户可以根据Rowkey进行高效的单行读.前缀匹配.范围查询操作.但若需要使用属性列进行查询时,则只能使用filter在查询范围内进行逐行过滤.在扫描范围较大时,会浪费大 ...

最新文章

  1. DCGAN论文笔记+源码解析
  2. weka: backwards with delete
  3. 数据结构与算法 | 用栈实现队列
  4. 2.15 更改所有者和所属组chown
  5. jQuery 操作 CSS
  6. 2020牛客暑期多校训练营(第二场)
  7. C语言编程笔记丨一种很酷的 C 语言技巧
  8. 华为lab-rs-v1-2.9_OSPF区域34
  9. python过滤敏感词汇_Python过滤敏感词汇
  10. 软件测试面试题目—接口测试面试题,梦寐以求的答案来了
  11. python处理考勤数据_python连接中控考勤机分析数据
  12. 会说话的汤姆猫游戏源码下载
  13. 边缘计算助力产业数字化转型
  14. Hadoop2.6.5安装部署及环境变量配置
  15. 三相异步电动机的定子磁动势
  16. 人活着最重要的是开心,理财最重要的是回本
  17. Mongodb的集群
  18. 023-zabbix性能优化中的几个中肯建议
  19. Android 10.0动态修改系统属性设备型号(Build.MODEL)
  20. 女朋友让我写 1 万字检讨

热门文章

  1. 设计模式的概念和分类
  2. 一文“妙”解逻辑斯蒂回归(LR)算法
  3. 在MAC下安装一些软件时提示来自身份不明开发者
  4. ES6箭头函数(Arrow Functions)
  5. linux学习笔记-第六课-/etc/passwd,/etc/shadow,useradd,su,sudo等
  6. 网页中启动QQ的 XX 命令
  7. 测序发展史:150年的风雨历程
  8. python虚拟环境 virtualenv工具
  9. php.ini设置相关信息汇总
  10. 1021. 个位数统计 (15)