Coprocessor方式二级索引

1.

Coprocessor提供了一种机制可以让开发者直接在RegionServer上运行自定义代码来管理数据。
通常我们使用get或者scan来从Hbase中获取数据,使用Filter过滤掉不需要的部分,最后在获得的数据上执行业务逻辑。但是当数据量非常大的时候,这样的方式就会在网络层面上遇到瓶颈。客户端也需要强大的计算能力和足够大的内存来处理这么多的数据,客户端的压力就会大大增加。但是如果使用Coprocessor,就可以将业务代码封装,并在RegionServer上运行,也就是数据在哪里,我们就在哪里跑代码,这样就节省了很大的数据传输的网络开销。

2. Coprocessor有两种:Observer和Endpoint
EndPoint主要是做一些计算用的,比如计算一些平均值或者求和等等。而Observer的作用类似于传统关系型数据库的触发器,在一些特定的操作之前或者之后触发。
Observer Coprocessor的使用场景如下:
2.1. 安全性:在执行Get或Put操作前,通过preGet或prePut方法检查是否允许该操作;
2.2. 引用完整性约束:HBase并不直接支持关系型数据库中的引用完整性约束概念,即通常所说的外键。但是我们可以使用Coprocessor增强这种约束。比如根据业务需要,我们每次写入user表的同时也要向user_daily_attendance表中插入一条相应的记录,此时我们可以实现一个Coprocessor,在prePut方法中添加相应的代码实现这种业务需求。
2.3. 二级索引:可以使用Coprocessor来维持一个二级索引。正是我们需要的

Vi hs2.java

import java.io.IOException;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.client.Put; public class hs2{
public static void main(String[] args){
HBaseConfiguration config = new HBaseConfiguration();
config.set("hbase.zookeeper.quorum", "h201,h202,h203");
String tablename = new String("user1");
try{
HBaseAdmin admin = new HBaseAdmin(config);
if(admin.tableExists(tablename)){
admin.disableTable(tablename);
admin.deleteTable(tablename);
}
HTableDescriptor tableDesc = new HTableDescriptor(tablename);
tableDesc.addFamily(new HColumnDescriptor("cf1")); admin.createTable(tableDesc);
admin.close(); HTable table = new HTable(config, Bytes.toBytes("user1"));
Put put1 = new Put(Bytes.toBytes("101"));
put1.add(Bytes.toBytes("cf1"),Bytes.toBytes("name"),Bytes.toBytes("zs1")); Put put2 = new Put(Bytes.toBytes("102"));
put2.add(Bytes.toBytes("cf1"),Bytes.toBytes("name"),Bytes.toBytes("ls1")); table.put(put1);
table.put(put2);
table.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}

Vi hs3.java

import java.io.IOException;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.client.Put; public class hs3{
public static void main(String[] args){
HBaseConfiguration config = new HBaseConfiguration();
config.set("hbase.zookeeper.quorum", "h201,h202,h203"); String tablename = new String("user2");
try{
HBaseAdmin admin = new HBaseAdmin(config);
if(admin.tableExists(tablename)){
admin.disableTable(tablename);
admin.deleteTable(tablename);
}
HTableDescriptor tableDesc = new HTableDescriptor(tablename);
tableDesc.addFamily(new HColumnDescriptor("cf1")); admin.createTable(tableDesc);
admin.close(); HTable table = new HTable(config, Bytes.toBytes("user2"));
Put put1 = new Put(Bytes.toBytes("zs1"));
put1.add(Bytes.toBytes("cf1"),Bytes.toBytes("id"),Bytes.toBytes("101")); Put put2 = new Put(Bytes.toBytes("ls1"));
put2.add(Bytes.toBytes("cf1"),Bytes.toBytes("id"),Bytes.toBytes("102")); table.put(put1);
table.put(put2);
table.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}

创建两张表

User1

Rowkeycf1:name

101   zs1

102   ls1

User2

Rowkeycf1:id

zs1  101

ls1  102

动态加载

RegionObserver类提供的所有回调函数都需要一个特殊的上下文作为共同的参数: ObserverContext类,它不仅提供了访问当前系统环境的入口,同时也添加了一些关键功能用以通知协处理器框架在回调函数完成时需要做什么。

ObserverContext类提供的方法

E getEnvironment()

返回当前协处理器环境的应用

void bypass()

当用户代码调用此方法时,框架将使用用户提供的值,而不使用框架通常使用的值

void complete()

通知框架后续的处理可以被跳过,剩下没有被执行的协处理器也会被跳过。这意味着当前协处理器的响应是最后的一个协处理器

boolean shouldBypass()

框架内部用来检查标志位

boolean shouldComplete()

框架内部用来检查标志位

void prepare(E env)

使用特定的环境准备上下文。这个方法只供内部使用。它被静态方法createAndPrepare使用

static <T extends CoprocessorEnvironment> ObserverContext<T> createAndPrepare(

初始化上下文的静态方法。当提供的context参数是null时,它会创建一个新实例

Vi Ic.java

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Durability;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver;
import org.apache.hadoop.hbase.coprocessor.ObserverContext;
import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;
import org.apache.hadoop.hbase.regionserver.wal.WALEdit;
import org.apache.hadoop.hbase.HBaseConfiguration;
import java.io.IOException;
import java.util.Iterator;
import java.util.List; public class Ic extends BaseRegionObserver { @Override
public void prePut(ObserverContext<RegionCoprocessorEnvironment> e, Put put, WALEdit edit, Durability durability) throws IOException { HBaseConfiguration config = new HBaseConfiguration();
config.set("hbase.zookeeper.quorum", "h201,h202,h203"); HTable table = new HTable(config, "user2"); List<Cell> kv = put.get("cf1".getBytes(), "name".getBytes());
Iterator<Cell> kvItor = kv.iterator();
while (kvItor.hasNext()) {
Cell tmp = kvItor.next();
final byte[] value = tmp.getValue();
Put indexPut = new Put(value); indexPut.add("cf1".getBytes(), "id".getBytes(), tmp.getRow());
table.put(indexPut); }
table.close();
}
}

[hadoop@h201 hhh]$ /usr/jdk1.7.0_25/bin/javac Ic.java

[hadoop@h201 hhh]$ /usr/jdk1.7.0_25/bin/jar cvf Icc.jar Ic*.class

[hadoop@h201 hhh]$ hadoop fs -put Icc.jar /

加载:

[hadoop@h201 hbase-1.0.0-cdh5.5.2]$ bin/hbase shell

1.hbase(main):001:0> disable 'user1'

2.hbase(main):002:0> alter 'user1' ,METHOD=>'table_att','coprocessor'=>'hdfs://h201:9000/Icc.jar|Ic|1001'

***1001为优先级****

3.hbase(main):003:0> enable 'user1'

验证:

User1 插入一条数据

hbase(main):005:0> put 'user1','105','cf1:name','ww1'

发现user2的表中也多出了一条 ww1 105

hbase coprocessor 二级索引的更多相关文章

  1. 085 HBase的二级索引,以及phoenix的安装(需再做一次)

    一:问题由来 1.举例 有A列与B列,分别是年龄与姓名. 如果想通过年龄查询姓名. 正常的检索是通过rowkey进行检索. 根据年龄查询rowkey,然后根据rowkey进行查找姓名. 这样的效率不高 ...

  2. HBase建立二级索引的一些解决方式

    HBase的一级索引就是rowkey,我们仅仅能通过rowkey进行检索. 假设我们相对hbase里面列族的列列进行一些组合查询.就须要採用HBase的二级索引方案来进行多条件的查询. 常见的二级索引 ...

  3. HBase的二级索引,以及phoenix的安装(需再做一次)

    一:HBase的二级索引 1.讲解 uid+ts 11111_20161126111111:查询某一uid的某一个时间段内的数据 查询某一时间段内所有用户的数据:按照时间 索引表 rowkey:ts+ ...

  4. 基于Solr实现HBase的二级索引

    文章来源:http://www.open-open.com/lib/view/open1421501717312.html 实现目的: 由于hbase基于行健有序存储,在查询时使用行健十分高效,然后想 ...

  5. 利用Phoenix为HBase创建二级索引

    为什么需要Secondary Index 对于Hbase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询.如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫瞄. ...

  6. HBase的二级索引

    使用HBase存储中国好声音数据的案例,业务描述如下: 为了能高效的查询到我们需要的数据,我们在RowKey的设计上下了不少功夫,因为过滤RowKey或者根据RowKey查询数据的效率是最高的,我们的 ...

  7. hbase构建二级索引解决方案

    关注公众号:大数据技术派,回复"资料",领取1024G资料. 1 为什么需要二级索引 HBase的一级索引就是rowkey,我们仅仅能通过rowkey进行检索.假设我们相对Hbas ...

  8. [How to] MapReduce on HBase ----- 简单二级索引的实现

    1.简介 MapReduce计算框架是二代hadoop的YARN一部分,能够提供大数据量的平行批处理.MR只提供了基本的计算方法,之所以能够使用在不用的数据格式上包括HBase表上是因为特定格式上的数 ...

  9. HBase 二级索引与Join

    二级索引与索引Join是Online业务系统要求存储引擎提供的基本特性.RDBMS支持得比较好,NOSQL阵营也在摸索着符合自身特点的最佳解决方案. 这篇文章会以HBase做为对象来探讨如何基于Hba ...

随机推荐

  1. PAT1130:Infix Expression

    1130. Infix Expression (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Give ...

  2. Python接口测试之对MySQL/unittest框架/Requests 的操作

    单元测试支持测试自动化. 共享的安装程序和关闭代码测试. 聚合成集合,测试和报告框架从测试的独立性.单元测试模块提供可以很容易地支持这些素质的一组测试的类.关于unittest 测试框架建议可以到官方 ...

  3. Myeclipse按包装SVN

    最简单步骤:把features和plugins直接放到Myeclipse安装包的dropins中,从新启动eclipse即可 features和plugins下载地址:http://pan.baidu ...

  4. springboot中配置tomcat的access log

    在tomcat的access中打印出请求的情况可以帮助我们分析问题,通常比较关注的有访问IP.线程号.访问url.返回状态码.访问时间.持续时间. 在Spring boot中使用了内嵌的tomcat, ...

  5. 错误 C2280 Union : 尝试引用已删除的函数 以及 警告 C4624 “Grade”: 已将析构函数隐式定义为“已删除”的一种解决方法

    Union 是C/C++语言中的一种结构类型,用于定义可共享内存的数据变量的一种方式,初次使用Union联合体时可能会遇到以下问题: 错误 C2280 Union : 尝试引用已删除的函数 警告 C4 ...

  6. LeetCode Javascript实现 169. Majority Element 217. Contains Duplicate(两个对象比较是否相等时,如果都指向同一个对象,a==b才是true)350. Intersection of Two Arrays II

    169. Majority Element /** * @param {number[]} nums * @return {number} */ var majorityElement = funct ...

  7. 使用STM32Cube在STM32F7开发板上实现SD+Freertos+Fatfs

    简介 最近项目中可能需要使用到SD卡,所以需要对SD卡的配置和使用调研,在配置过程中遇到了一些问题,在此记录一下. STM32Cube配置 Pinout 只需要注意绿色部分的设定 Clock配置 这里 ...

  8. 用java代码将从数据库中取出的具有父子关系的数据转成json格式

    思路:①.取出数据中的所有父节点放入一个集合中②.取出数据中所有为该父节点的子节点放入另一个集合中③.用到迭代的方法将子节点一层一层的遍历工具类:package com.assasion.test;i ...

  9. 【数学建模】【APIO2015】Palembang Bridges

    Description 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B. 每一块区域沿着河岸都建了恰好 1000000001 栋的建筑,每条岸边的建筑都从 0 编号到 10000 ...

  10. BZOJ_3555_[Ctsc2014]企鹅QQ_哈希

    BZOJ_3555_[Ctsc2014]企鹅QQ_哈希 Description PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为 ...