HBase在0.92之后引入了coprocessors,提供了一系列的钩子,让我们能够轻易实现访问控制和二级索引的特性。下面简单介绍下两种coprocessors,第一种是Observers,它实际类似于触发器,第二种是Endpoint,它类似与存储过程。由于这里只用到了Observers,所以只介绍Observers,想要更详细的介绍请查阅(https://blogs.apache.org/hbase/entry/coprocessor_introduction)。observers分为三种:
RegionObserver:提供数据操作事件钩子;
WALObserver:提供WAL(write ahead log)相关操作事件钩子;
MasterObserver:提供DDL操作事件钩子。
相关接口请参阅hbase api。
下面给出一个例子,该例子使用RegionObserver实现在写主表之前将索引数据先写到另外一个表:
1 |
package com.dengchuanhua.testhbase; |
3 |
import java.io.IOException; |
4 |
import java.util.Iterator; |
7 |
import org.apache.hadoop.conf.Configuration; |
8 |
import org.apache.hadoop.hbase.KeyValue; |
9 |
import org.apache.hadoop.hbase.client.HTable; |
10 |
import org.apache.hadoop.hbase.client.Put; |
11 |
import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver; |
12 |
import org.apache.hadoop.hbase.coprocessor.ObserverContext; |
13 |
import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; |
14 |
import org.apache.hadoop.hbase.regionserver.wal.WALEdit; |
16 |
public class TestCoprocessor extends BaseRegionObserver { |
19 |
public void prePut( final ObserverContext<RegionCoprocessorEnvironment> e, |
20 |
final Put put, final WALEdit edit, final boolean writeToWAL) |
23 |
Configuration conf = new Configuration(); |
26 |
HTable table = new HTable(conf, "indexTableName" ); |
27 |
List<KeyValue> kv = put.get( "familyName" .getBytes(), "columnName" .getBytes()); |
28 |
Iterator<KeyValue> kvItor = kv.iterator(); |
29 |
while (kvItor.hasNext()) { |
30 |
KeyValue tmp = kvItor.next(); |
31 |
Put indexPut = new Put(tmp.getValue()); |
32 |
indexPut.add( "familyName" .getBytes(), "columnName" .getBytes(), tmp.getRow()); |
写完后要加载到table里面去,先把该文件打包成test.jar并上传到hdfs的/demo路径下,然后操作如下:
1. disable ‘testTable’
2. alter ‘testTable’, METHOD=>’table_att’,’coprocessor’=>’hdfs:///demo/test.jar|com.dengchuanhua.testhbase.TestCoprocessor|1001′
3. enable ‘testTable’
然后往testTable里面插数据就会自动往indexTableName写数据了。
总结:本文主要介绍了一个用coprocessor实现二级索引的例子。
阅读全文……