【转】华为HBase索引模块应用:HBase二级索引模块:hindex调研 2014年10月16日

文章出处:http://www.batchfile.cn/?p=63

HBase二级索引模块:hindex调研

hindx是HBase的二级索引方案,为HBase提供声明式的索引,使用协处理器对索引表进行自动创建和维护,客户端不需要对数据进行双写。并且hindex采用了一些巧妙的Rowkey编排方式,使索引数据和实际数据分布在同一个Region,实现了较高的查询性能。介绍如下:huawei-hbase-secondary-secondary-index-implementations

代码下载地址:https://github.com/Huawei-Hadoop/hindex

源码介绍

hindex基于HBase 0.94.8实现,运行在HBase服务端,采用协处理器实现索引表的维护和查询:

  • org.apache.hadoop.hbase.index.coprocessor.master.IndexMasterObserver
    拦截DDL操作,在数据库表发生创建/删除/Enable/Disable/Drop操作时同步创建/更改/删除Index表。并且拦截region balance过程,在HFile发生合并和分裂时同步修改Index表,确保Index表的记录与统一Rowkey的数据记录永远在同一Region Server,加快查询效率。
  • org.apache.hadoop.hbase.index.coprocessor.regionserver.IndexRegionObserver
    拦截数据库表的Put/Delete/Get/Scan/Flush等操作,同步更新Index表的数据。
  • org.apache.hadoop.hbase.index.coprocessor.wal.IndexWALObserver 同步WAL操作,在Region Server的预写区域发生操作时判断Index Table是否需要同步操作,将预写操作提交到Region Server。

源码包含完整的hbase-0.94.8的实现,与二级索引相关的代码都在/secondaryindex/src/main/java目录。

目前已经实现了索引表同步/索引表Balance/索引同步/索引SCAN。发布说明中待实现功能如下:

  • Dynamically add/drop index
  • Integrate Secondary Index Management in the HBase Shell
  • Optimize range scan scenarios
  • HBCK tool support for Secondary index tables
  • WAL Optimizations for Secondary index table entries
  • Make Scan Evaluation Intelligence Pluggable

使用说明

下载源码,采用maven编译:

mvn package -DskipTests=true 

将编译产物上传到HBase服务器:

scp target/hbase-0.94.8.jar [email protected]:$HBASE_HOME/conf/ 

HBase配置(hbase-env.sh):

export HBASE_CLASSPATH=$HBASE_HOME/conf/hbase-0.94.8.jar 

HBase配置(hbase-site.xml):

<property> <name>hbase.coprocessor.master.classes</name> <value>org.apache.hadoop.hbase.index.coprocessor.master.IndexMasterObserver</value></property><property> <name>hbase.coprocessor.region.classes</name> <value>org.apache.hadoop.hbase.index.coprocessor.regionserver.IndexRegionObserver</value></property><property> <name>hbase.coprocessor.wal.classes</name> <value>org.apache.hadoop.hbase.index.coprocessor.wal.IndexWALObserver</value></property> 

重新启动HBase,访问:

可以看到协处理器已经安装成功:

Coprocessors [IndexMasterObserver]
Coprocessors [IndexRegionObserver, IndexWALObserver]

调用hbase和hindex的Java api实现创建表并且在表上创建索引:

 IndexedHTableDescriptor htd = new IndexedHTableDescriptor(usertableName); IndexSpecification iSpec = new IndexSpecification(indexName); HColumnDescriptor hcd = new HColumnDescriptor(columnFamily); iSpec.addIndexColumn(hcd, indexColumnQualifier, ValueType.String, 10); htd.addFamily(hcd); htd.addIndex(iSpec); admin.createTable(htd); 

按照预料的情况,后台应该会同时出现数据表和索引表,向数据表中插入数据时,索引表中会按照索引定义自动出现反向索引。可是没有出现这个现象,why?

版本兼容性

原因是hindex和现场的HBase版本不兼容性。hindex基于hbase-0.94.8版本开发,但是现场采用的是hbase-0.94.6-cdh4.3.0,是由Cloudera基于hbase-0.94.6开发的,这两个版本的协处理器接口不一致。以MasterObserver为例,拦截create table操作在hbase-0.94.8中如下:

  • postCreateTable(ObserverContext<MasterCoprocessorEnvironment>, HTableDescriptor, HRegionInfo[])
  • postCreateTableHandler(ObserverContext<MasterCoprocessorEnvironment>, HTableDescriptor, HRegionInfo[])
  • preCreateTable(ObserverContext<MasterCoprocessorEnvironment>, HTableDescriptor, HRegionInfo[])
  • preCreateTableHandler(ObserverContext<MasterCoprocessorEnvironment>, HTableDescriptor, HRegionInfo[])

在hbase-0.94.6中如下:

  • postCreateTable(ObserverContext<MasterCoprocessorEnvironment>, HTableDescriptor, HRegionInfo[])
  • preCreateTable(ObserverContext<MasterCoprocessorEnvironment>, HTableDescriptor, HRegionInfo[])

因此在hindex中实现的协处理器无法按照预订的流程建立索引表。跟踪hbase的mastar日志,只有调用preCreateTable和postCreateTable的日志,preCreateTableHandler和postCreateTableHandler中的代码都没有执行。

尝试一下修改IndexMasterObserver的方法,按照hbase-0.94.6的接口名称实现,重新部署,创建数据表和索引后,发现索引表自动创建成功了:

User Table Online Regions Description
test 1 {NAME => ‘test’, FAMILIES => [{NAME => ‘info’}]}
test_idx 1 {NAME => ‘test_idx’, SPLIT_POLICY => ‘org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy’, MAX_FILESIZE => ‘9223372036854775807’, FAMILIES => [{NAME => ‘d’}]}

但是只有空的索引表,索引数据还没有进入到索引表中。需要再修改IndexRegionObserver和IndexWALObserver,还要处理HFile分裂与合并的情况,总之要把secondary index的功能完全移植到hbase-0.94.6-cdh4.3.0。还是算了吧。

查一下CDH有没有基于hbase-0.94.8的版本。CDH目前已经开发到5.0.0-beta-1,基于hbase-0.95.2开发:
CDH-Version-and-Packaging-Information

看来无论是cdh4.5.0还是cdh5.0.0-beta1都没有直接基于hbase-0.94.8。如果想使用hindex的功能,需要做移植和测试工作。当然也可以选择使用Apache原生的hbase-0.94.8,但是这个版本没有基于Hadoop 2的部署版,只能基于Hadoop 1部署。

在查询需求比较确定的情况下,可以预先规划索引结构,相信hindex是一个很好的方案,是值得一搞的。有时间的话继续研究。

时间: 2024-10-26 00:38:38

【转】华为HBase索引模块应用:HBase二级索引模块:hindex调研 2014年10月16日的相关文章

2014年6月6日--华为机试

准备了还有一段时间了,结果还是悲剧了,主要准备的是算法,结果华为机试更看重字符串的操作,这一块正好是自己的弱项,哎.不过还有时间,这几个月多刷刷题,多锻炼锻炼,加油吧. 机试一共考了三道题,两道简单点的,一道难题,难题考得是状态机,不知道是什么东西╮(╯▽╰)╭,简单的两题做的也不好,回来在重新做一下.   1.倒置英文句子中单词的字母顺序. hello, I am good.  ->  olleh, I ma doog. 这题其实不难,当时脑子有点纠结符号,所以没做出来,还有一点客观原因,平时

深入非聚集索引:楼梯SQL Server二级索引

通过大卫·杜兰特,2017/10/18(第一次出版:2014/11/26) 该系列 本文是楼梯系列的一部分:SQL Server的阶梯索引 索引数据库设计的基础,告诉开发人员使用数据库设计者的意图. 不幸的是索引时往往是后加上的性能问题出现. 终于在这里是一个简单的系列文章,应该让任何数据库专业迅速"加速" SQL Server的一级索引楼梯介绍了SQL Server索引,一般来说,和非聚集索引. 作为我们的第一个案例研究中,我们演示了索引的潜在好处,当从一个表中检索单个行. 在这个层

HBase协处理器同步二级索引到Solr

一. 背景二. 什么是HBase的协处理器三. HBase协处理器同步数据到Solr四. 添加协处理器五. 测试六. 协处理器动态加载 一. 背景 在实际生产中,HBase往往不能满足多维度分析,我们能想到的办法就是通过创建HBase数据的二级索引来快速获取rowkey,从而得到想要的数据.目前比较流行的二级索引解决方案有Lily HBase Indexer,Phoenix自带的二级索引,华为Indexer,以及360的二级索引方案.上面的目前使用比较广泛的应该是Lily HBase Index

关于MySQL InnoDB表的二级索引是否加入主键列的问题解释

关于MySQL InnoDB表的二级索引是否加入主键,总结如下: 1对于MySQL InnoDB表的二级索引是否加入主键,官方也有明确的说明,建议线上MySQL的二级索引创建时强制加入主键所有的列,可以做到所有的MySQL 版本统一. 2.MySQL 5.6.9之前,InnoDB引擎层是会对二级索引做自动扩展,但是优化器不能识别出扩展的主键. 3.MySQL 5.6.9开始InnoDB引擎层是会对二级索引做自动扩展,优化器能识别出扩展的主键. 4.索引的大小一样,二级索引有没有加入主键列,在In

使用二级索引改进数据访问DynamoDB

DynamoDB 支持两种类型的二级索引: Global secondary index — 其分区键和排序键可以与基表上的分区键和排序键不同的索引.全局二级索引被视为“全局”,是因为对索引执行的查询可以跨基表中所有分区的所有数据. 本地二级索引 — 分区键与基表相同.但排序键不同的索引.local secondary index的含义是“本地”,表示local secondary index的每个分区的范围都将限定为具有相同分区键值的基表分区. 在确定要使用的索引类型时,应考虑应用程序的要求.

◆CFA考试二级胜在根本-9月27日上海交大解密讲座◆

跨越CFA考试"分水岭"·攻克2015年6月CFA二级考试 与你一起"鸟瞰"CFA二级考试,赢在起点,胜在根本 金程教育2015年6月CFA二级真题大解密及备考策略说明会(上海专场) ◆2014年9月27日(周六)14:30-16:30 上海交大徐汇校区 ◆编辑短信内容"姓名+考试级别"发送至"◆13162963778◆"预约,收到回执短信,即为预约成功. 作为CFA考试中的"分水岭",CFA二级考试成为广

sqlserver聚合索引(clustered index) / 非聚合索引(nonclustered index)的理解

1. 什么是聚合索引(clustered index) / 什么是非聚合索引(nonclustered index)? 可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引).下面,我们举例来说明一下聚集索引和非聚集索引的区别: 其实,我们的汉语字典的正文本身就是一个聚集索引.比如,我们要查"安"字,就会很自然地翻开字典的

聚合索引(clustered index) / 非聚合索引(nonclustered index)

以下我面试经常问的2道题..尤其针对觉得自己SQL SERVER 还不错的同志.. 呵呵 很难有人答得好.. 各位在我收集每个人擅长的东西时,大部分都把SQL SERVER 标为Expert,看看是否答的上来.. 1. 什么是聚合索引(clustered index) / 什么是非聚合索引(nonclustered index)? 2. 聚合索引和非聚合索引有什么区别? 深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clust

Hbase 学习(九) 华为二级索引(原理)

这个是华为的二级索引方案,已经开放源代码了,下面是网上的一篇讲解原理的帖子,发出来和大家共享一下. 经过本人认真阅读了一下代码,发现这个源码仅供参考,想要集成到原有的集群当中是有点儿难度的,它对hbase的源码进行不少的修改. 源码地址:https://github.com/Huawei-Hadoop/hindex 下面来对其方案做一个分析. 1.整体架构 这个架构在Client Ext中设定索引细节,在Balancer中收集信息,在Coprocessor中管理二级索引数据. 2.表创建 在创建