上帝视角Hbase二级索引方案全解析
点击上方蓝色字体,选择“设为星标”
回复”面试“获取更多惊喜
什么是二级索引
Coprocessor
协处理器类型
Coprocessor方案(Phoenix等)
Phoenix二级索引特点
非Coprocessor方案
Lily HBase Indexer
CDH Search
其他方案
什么是二级索引
HBase中的一级索引
指数据在写入region
时,会根据rowkey
进行排序后写入,之后regionserver
在加载region
时,会自动为当前region
的rowkey
创建一个LSM树的索引,方便对当前region
,rowkey
的查询。
那么问题来了。HBase本身只提供基于行键和全表扫描的查询,而行键索引单一,对于多维度的查询困难。
二级索引的本质就是建立各列值与行键之间的映射关系
。
Coprocessor
在讲解如何构建二级索引前,我们有必要简单介绍一下Coprocessor
这个核心特性。
在旧版本的(<0.92)Hbase中,统计数据表的总行数,需要使用Counter
方法,执行一次MapReduce Job
才能得到。虽然HBase在数据存储层中集成了MapReduce
,能够有效用于数据表的分布式计算。然而在很多情况下,做一些简单的相加或者聚合计算的时候,如果直接将计算过程放置在server 端,能够减少通讯开销,从而获得很好的性能提升。
在这种情况下,协处理器(Coprocessor)应运而生。它允许你将业务计算代码放入在RegionServer
的协处理器中,将处理好的数据再返回给客户端,这可以极大地降低需要传输的数据量,从而获得性能上的提升。同时协处理器也允许用户扩展实现HBase
目前所不具备的功能,如权限校验、二级索引、完整性约束等。
于是,HBase在0.92版本之后引入了协处理器(coprocessors),实现了一些激动人心的新特性:能够轻易建立二次索引、复杂过滤器(谓词下推)以及访问控制等。
协处理器类型
Observer协处理器
类似于传统数据库中的触发器,当发生某些事件的时候这类协处理器会被 Server 端调用。
Observer Coprocessor
就是一些散布在 HBase Server 端代码中的 hook 钩子,在固定的事件发生时被调用。比如:put 操作之前有钩子函数prePut
,该函数在 put 操作执行前会被Region Server
调用;在 put 操作之后则有postPut
`钩子函数。
当前Observer协处理器有下面4种类型:
RegionObserver:允许您观察 Region 上的事件,例如 Get 和 Put 操作;
RegionServerObserver:允许您观察与 RegionServer 操作相关的事件,例如启动、停止或执行合并、提交或回滚。
WALObserver:提供 WAL 相关操作钩子;
MasterObserver:提供 DDL-类型的操作钩子。如创建、删除、修改数据表等。
以上四种类型的 Observer 协处理器均继承自Coprocessor
接口;这四个接口中分别定义了所有可用的钩子方法以便在对应方法前后执行特定的操作。通常情况下我们并不会直接实现上面接口而是继承其Base实现类,Base 实现类只是简单空实现了接口中的方法,这样我们在实现自定义的协处理器时就不必实现所有方法只需要重写必要方法即可。
下面是以RegionObserver
为例子讲解Observer
这种协处理器的原理:
客户端发起get请求
该请求被分派给合适的
RegionServer
和RegioncoprocessorHost
拦截该请求,然后在该表上登记的每个RegionObserer
上调用preGet()如果没有被preGet拦截,该请求继续送到Region,然后进行处理
Region产生的结果再次被
coprocessorHost
拦截,调用postGet()处理假如没有postGet()拦截该响应,最终结果被返回给客户端
Observer协处理器
Endpoint
协处理器类似传统数据库中的存储过程,客户端可以调用这些 Endpoint
协处理器执行一段Server
端代码,并将Server
端代码的结果返回给客户端进一步处理,最常见的用法就是进行聚集操作;
如果没有协处理器,当用户需要找出一张表中的最大数据,即max 聚合操作,就必须进行全表扫描,在客户端代码内遍历扫描结果,并执行求最大值的操作。这样的方法无法利用底层集群的并发能力,而将所有计算都集中到 Client 端统一执 行,势必效率低下。
利用Coprocessor
,用户可以将求最大值的代码部署到HBase Server
端,HBase 将利用底层cluster
的多个节点并发执行求最大值的操作。即在每个 Region 范围内 执行求最大值的代码,将每个Region
的最大值在Region Server
端计算出,仅仅将该 max 值返回给客户端。在客户端进一步将多个Region
的最大值进一步处理而找到其中的最大值。这样整体的执行效率就会提高很多。
总体来看
Observer
允许集群在正常的客户端操作过程中可以有不同的行为表现Endpoint
允许扩展集群的能力,对客户端应用开放新的运算命令Observer
类似于 RDBMS 中的触发器,主要在服务端工作Endpoint
类似于 RDBMS 中的存储过程,主要在服务端工作Observer
可以实现权限管理、优先级设置、监控、ddl 控制、二级索引等功能Endpoint
可以实现 min、max、avg、sum、distinct、group by 等功能
基于上面的基本知识,Hbase二级索引的实现主要分为2种:
Coprocessor方案
和非Coprocessor方案
。
Coprocessor方案(Phoenix等)
其实从0.94版本开始,HBase官方文档已经提出了hbase上面实现二级索引的一种路径:
基于Coprocessor
(0.92版本开始引入,达到支持类似传统RDBMS的触发器的行为)开发自定义数据处理逻辑,采用数据"双写"(dual-write)策略,在有数据写入同时同步到二级索引表。
虽然官方一直也没提供内置的支持二级索引的工具, 不过业界也有些比较知名的基于Coprocessor
的开源方案:
华为的hindex
: 基于0.94版本,当年刚出来的时候比较火,但是版本较旧,看GitHub项目地址最近这几年就没更新过。
Apache Phoenix
: 功能围绕着SQL on hbase,支持和兼容多个hbase版本, 二级索引只是其中一块功能。二级索引的创建和管理直接有SQL语法支持,使用起来很简便, 该项目目前社区活跃度和版本更新迭代情况都比较好。
Apache Phoenix
在目前开源的方案中,是一个比较优的选择。主打SQL on HBase
, 基于SQL能完成HBase的CRUD操作,支持JDBC协议。Apache Phoenix
在Hadoop生态里面位置:
Phoenix二级索引特点
Covered Indexes
(覆盖索引) :把关注的数据字段也附在索引表上,只需要通过索引表就能返回所要查询的数据(列),所以索引的列必须包含所需查询的列(SELECT的列和WHRER的列)。Functional indexes
(函数索引):索引不局限于列,支持任意的表达式来创建索引。Global indexes
(全局索引):适用于读多写少场景。通过维护全局索引表,所有的更新和写操作都会引起索引的更新,写入性能受到影响。在读数据时,Phoenix SQL会基于索引字段,执行快速查询。Local indexes
(本地索引):适用于写多读少场景。在数据写入时,索引数据和表数据都会存储在本地。在数据读取时,由于无法预先确定region的位置,所以在读取数据时需要检查每个region(以找到索引数据),会带来一定性能(网络)开销。
优点: 基于Coprocessor的方案,从开发设计的角度看,把很多对二级索引管理的细节都封装在的Coprocessor具体实现类里面,这些细节对外面读写的人是无感知的, 简化了数据访问者的使用。
缺点: 但是Coprocessor的方案入侵性比较强, 增加了在Regionserver内部需要运行和维护二级索引关系表的代码逻辑等, 对Regionserver的性能会有一定影响。
非Coprocessor方案
选择不基于Coprocessor开发,自行在外部构建和维护索引关系也是另外一种方式。
常见的是采用底层基于Apache Lucene的Elasticsearch(下面简称ES)或Apache Solr ,来构建强大的索引能力、搜索能力, 例如支持模糊查询、全文检索、组合查询、排序等。
Lily HBase Indexer
Lily HBase Indexer
(也简称 HBase Indexer)是国外的NGDATA公司开源的基于solr的索引构建工具,特色是其基于HBase的备份机制,开发了一个叫SEP工具,通过监控HBase 的WAL日志(Put/Delete操作),来触发对solr集群索引的异步更新,基本对HBase无侵入性(但必须开启WAL)流程图如下所示:
CDH Search
CDHSearch
是Hadoop发行商Cloudera公司开发的基于solr的HBase检索方案,部分集成了Lily HBase Indexer
的功能。
下面是CDH search的核心组件交互图, 体现了在单次client端查询过程中, 核心的zookeeper和solr等的交互流程:
例如, Hbase结合Solr的场景:
基于Solr的HBase多条件查询原理很简单,将HBase表中涉及条件过滤的字段和rowkey在Solr中建立索引,通过Solr的多条件查询快速获得符合过滤条件的rowkey值,拿到这些rowkey之后在HBASE中通过指定rowkey进行查询。
其他方案
对于在外部自定义构建二级索引的方式,有自己的大数据团队的公司一般都会针对自己的业务场景进行优化,自行构建ES/Solr的搜索集群。例如基于ES构建海量索引和检索能力的案例:
八千里路云和月 | 从零到大数据专家学习路径指南
我们在学习Flink的时候,到底在学习什么?
193篇文章暴揍Flink,这个合集你需要关注一下
Flink生产环境TOP难题与优化,阿里巴巴藏经阁YYDS
Flink CDC我吃定了耶稣也留不住他!| Flink CDC线上问题小盘点
我们在学习Spark的时候,到底在学习什么?
在所有Spark模块中,我愿称SparkSQL为最强!
硬刚Hive | 4万字基础调优面试小总结
数据治理方法论和实践小百科全书
标签体系下的用户画像建设小指南
4万字长文 | ClickHouse基础&实践&调优全视角解析
【面试&个人成长】2021年过半,社招和校招的经验之谈
大数据方向另一个十年开启 |《硬刚系列》第一版完结
我写过的关于成长/面试/职场进阶的文章
当我们在学习Hive的时候在学习什么?「硬刚Hive续集」
你好,我是王知无,一个大数据领域的硬核原创作者。
做过后端架构、数据中间件、数据平台&架构、算法工程化。
专注大数据领域实时动态&技术提升&个人成长&职场进阶,欢迎关注。
上帝视角Hbase二级索引方案全解析相关推荐
- 基于ES的HBase二级索引方案
HBase不支持多条件查询,不提供二级索引,难以满足用户对检索功能多样性和高效率两方面的需求.由索引模块的需求分析可知,本文解决通过,提出数据与索引的分离,利用HBase数据库的存储模式灵活多变,容纳 ...
- (转)HBase二级索引与Join
二级索引与索引Join是Online业务系统要求存储引擎提供的基本特性.RDBMS支持得比较好,NOSQL阵营也在摸索着符合自身特点的最佳解决方案. 这篇文章会以HBase做为对象来探讨如何基于Hba ...
- 使用solr构建hbase二级索引
使用solr构建hbase二级索引 @(HBASE)[hbase, solr] 使用solr构建hbase二级索引 一概述 一业务场景描述 二技术方案 1技术方案一 2技术方案二 3关于索引的建议 二 ...
- hbase组合rowkey_「从零单排HBase 11」HBase二级索引解决方案
HBase一个令人惋惜的地方,就是不支持二级索引.因此,社区有了很多补充方案来填补HBase的二级索引能力的缺陷. 今天,我们就来看看有哪些二级索引方案,通过对比各个方案的优缺点,并结合我们的具体场景 ...
- CDH 6 安装 Hbase 二级索引 Solr + Key-Value Store Indexer
目录 一.集群安装Solr + Key-Value Store Indexer 二.创建Hbase二级索引 1.更改表结构,允许复制 2.创建相应的SolrCloud集合 3.创建 collecti ...
- 华为hbase二级索引(secondary index)细节分析
转载自:http://ju.outofmemory.cn/entry/50610 华为在HBTC 2012上由其高级技术经理Anoop Sam John透露了其二级索引方案,这在业界引起极大的反响,甚 ...
- 基于Solr的Hbase二级索引
关于Hbase二级索引 HBase 是一个列存数据库,每行数据只有一个主键RowKey,无法依据指定列的数据进行检索.查询时需要通过RowKey进行检索,然后查看指定列的数据是什么,效率低下.在实际应 ...
- 华为HBase 二级索引调研
1.Overall Solution 解决思想: 一个user table对应一个index table index的创建与更新全部在RS端的cp-processor里实现 核心思想:一个actual ...
- Phoenix+Hbase二级索引
使用的软件版本,注意软件版本很重要,很重要 apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz hadoop-2.9.2.tar.gz hbase-2.0.5-bin. ...
- HBase二级索引的设计与应用(详解)
最近面试,涉及到了HBase的多条件组合查询,数据存储用的是HBase,恰恰HBase对于这种场景的查询特别不给力,一般HBase的查询都是通过RowKey(要把多条件组合查询的字段都拼接在RowKe ...
最新文章
- LINUX安装ORACLE 9204 报错解决!!
- 用React开发SAP Fiori应用
- linux刷新磁盘_Linux内核Page Cache和Buffer Cache关系及演化历史
- 诺基亚AirScale支持低频段和高频段5G服务 确保运营商投资收入
- POJ3728 THE MERCHANT LCA RMQ DP
- 图说Netty服务端启动过程
- h5和web前端的区别
- 关于centos启动报错:Failed to start Crash recovery kernel arming的解决方案
- 井通swtc能不能涨到2元_玉米收购价最高涨110元一吨,节后玉米能否破1.2?收购商说得有理...
- Linux网络服务参数配置说明及实战
- 【前端知识梳理】HTML篇 笔记整理(一)
- 服务器虚拟vps后怎么分销,服务器vps分销
- 禁止QQ2010(2009)弹迷你首页的方法
- 成像系统光照度(相机成像辐射传输)
- Linux搜索查找命令【详细整理】
- 阿里云对运营10多年来持续最久的故障发布复盘说明
- 三、数据特性计算(含信道通讯计算、码元速率计算、尼奎斯特定理、香农定理以及相应的练习题)——网络工程师成长之路
- 信号分析——导数(Java/Matlab)
- DEL命令居然无法删除文件夹!
- 看python源代码的顺序_查看“Python-2020-fall”的源代码
热门文章
- QListView超简单的更新列表
- 使用python gzip进行解压和压缩
- 用android实现GB28181前端设备接入平台
- 056 CSRF跨站请求伪造
- vue JsBarcode的使用
- Java可以加速播放的播放器,基于live555的rtsp播放器之十二:使用soundtouch加速音频播放...
- MT8127_Android_scatter.txt 文件添加backup分区
- 最新树莓派系统PUTTY用默认用户名和密码登录不上的解决方法
- GO分析(cytoscape)
- 如何将origin pro的界面切换变成中文显示?