zoukankan      html  css  js  c++  java
  • 华为二级索引解决方案

    Hbase作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和、计数、排序等操作。比如,在旧版本的(<0.92)Hbase中,统计数据表的总行数,需要使用Counter方法,执行一次MapReduce Job才能得到。虽然HBase在数据存储层中集成了MapReduce,能够有效用于数据表的分布式计算。然而在很多情况下,做一些简单的相加或者聚合计算的时候,如果直接将计算过程放置在server端,能够减少通讯开销,从而获得很好的性能提升。于是,HBase在0.92之后引入了协处理器(coprocessors),实现一些激动人心的新特性:能够轻易建立二次索引、复杂过滤器(谓词下推)以及访问控制等。

    而华为二级索引是华为内部一个解决这个问题的方案。大致思路如下

    这个是华为的二级索引方案,已经开放源代码了,下面是网上的一篇讲解原理的帖子,发出来和大家共享一下。

    经过本人认真阅读了一下代码,发现这个源码仅供参考,想要集成到原有的集群当中是有点儿难度的,它对hbase的源码进行不少的修改。

    源码地址:https://github.com/Huawei-Hadoop/hindex

    下面来对其方案做一个分析。

    1.整体架构

    这个架构在Client Ext中设定索引细节,在Balancer中收集信息,在Coprocessor中管理二级索引数据。

    architecture  华为hbase二级索引(secondary index)细节分析

    2.表创建

    在创建表的时候,在同一个region server上创建索引表,且一一对应。

    tableCreate 华为hbase二级索引(secondary index)细节分析

    3.插入操作

    在主表中插入某条数据后,用Coprocessor将索引列写到索引表中去,写道索引表中的数据的主键为:region开始key+索引名+索引列值+主表row key。这么做,是为了让其在同一个分布规则下,索引表会跟主表在通过region server上,在查询的时候就可以少一次rpc。

    putOperation 华为hbase二级索引(secondary index)细节分析

    4.scan操作

    一个查询到来的时候,通过coprocessor钩子,先从索引表中查询范围row,然后再从主表中相关row中扫描获得最终数据。

    scan 华为hbase二级索引(secondary index)细节分析

    5. split操作处理

    为了使主表和索引表在同一个RS上,要禁用索引表的自动和手动split,只能由主表split的时候触发,当主表split的时候,对索引表按其对应数据进行划分,同时,对索引表的第二个daughter split的row key的前面部分修改为对应的主键的row key。

    split 华为hbase二级索引(secondary index)细节分析

    6. 性能

    查询性能极大提升,插入性能下降10%左右

    performance1 华为hbase二级索引(secondary index)细节分析

    performance2 华为hbase二级索引(secondary index)细节分析

    总结,本文对华为hbase使用coprocessor进行二级索引的方案的创建表,插入数据,查询数据的步骤进行了一个粗略分析,以窥其全貌。在使用的时候,可以作为一个参考。

    总结,华为的二级索引思路是通过hbase的协处理器加快hbase的统计性能和查询性能,但是相应的建立索引的时候会导致索引表插入过多的键位,导致插入数据速度过低,上面说了大概百分之十,原因是每次插入数据都要相应向索引表添加数据(华为索引表内容都是byte内容,加快插入速度但是每条数据需要插入两个表速度降低难以避免),速度理论上会随着字段的变多而降低,通过二级索引查询时候rowkey过长也难免会造成IO流过大。(这点有点类似DBMS DBMS做索引建立树结构索引响应也会造成磁盘过大,也就是用空间换区了速度)

    关于协处理器是hbase0。92加入的新特性。可以在服务端提供统计的一类DDL功能,具体可以这里了解(http://blog.csdn.net/lifuxiangcaohui/article/details/39991183/)

  • 相关阅读:
    excel的部分使用方法
    liist不同遍历优缺点
    oracle中rownum和rowid的区别
    Oracle中插入100万条数据
    Java中手动提交事务
    oracle 查看表是否存在、包含某字段的表、表是否包含字段
    form的一个特性
    使用oracle的保留字作为字段名称并进行操作的方法
    thinkphp不能够将ueditor中的html文本显示
    java7,java8 中HashMap和ConcurrentHashMap简介
  • 原文地址:https://www.cnblogs.com/yaohaitao/p/6882214.html
Copyright © 2011-2022 走看看