HBase CoProcessor介绍以及使用
2017-09-22 17:23
549 查看
HBase协处理器包含 Observer和Endpoint 2部分,分表代表类似数据库的触发器和存储过程。 当你插入,删除前或者后,会触发相应的代码,这个代码是你添加到触发器的。
我们先来写一个极其简单的示例,用来快速了解这个东西是啥玩意。
package com.isesol.storm;
import java.io.IOException;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.client.Durability;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
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.filter.BinaryComparator;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.regionserver.RegionScanner;
import org.apache.hadoop.hbase.regionserver.wal.WALEdit;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver;
public class observTrigger extends BaseRegionObserver {
/* get, 如果 rowkey为admin,那么不返回数据 */
@Override
public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, final Get get, final List<Cell> results)
throws IOException {
if (Bytes.equals(get.getRow(), Bytes.toBytes("admin"))) {
/*
* Cell c = CellUtil.createCell(get.getRow(), Bytes.toBytes("cf"),
* Bytes.toBytes("name"), System.currentTimeMillis(), (byte) 4,
* Bytes.toBytes("1111"));
*
* results.add(c);
*/
e.bypass();
}
}
@Override
public RegionScanner preScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> e, final Scan scan,
final RegionScanner s) throws IOException {
scan.setRowPrefixFilter(Bytes.toBytes("fuck"));
return s;
}
@Override
public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e, final Put put, final WALEdit edit,
final Durability durability) throws IOException {
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum",
"datanode01.isesol.com:2181,datanode02.isesol.com:2181,datanode03.isesol.com:2181,datanode04.isesol.com:2181");
conf.set("hbase.zookeeper.property.clientPort", "2181");
HTable table = new HTable(conf, "test2");
Put put01 = new Put(put.getRow());
put01.add(Bytes.toBytes("cf"), Bytes.toBytes("name"), Bytes.toBytes("xxx"));
table.put(put);
table.close();
}
}
以上写了3个示例,get, scan 实现权限控制,put实现表同步(二级索引的做法和这个是一样的)
加载coprocessor:
alter 'test1' , METHOD => 'table_att', 'COPROCESSOR'=> 'hdfs://nameservice1/tmp/observeTrigger.jar|com.isesol.storm.observTrigger||'
取消加载:
alter 'test1' , METHOD => 'table_att_unset', NAME=> 'coprocessor$1'
这里主要讲一下碰到的问题:
1. 通过继承虚拟类来实现 协处理器,不要去继承接口
2. 在加载协处理器碰到一个问题,如果一个表加载协处理器之后,修改协处理器好像不会生效,我最后通过删除表,然后重新加载才起作用,不知道这里是否为BUG
3. 协处理器需要经过严格的测试,小心使用,一旦协处理器有问题, 这个玩意会导致regionserver全部down掉,或者某个regionserver down掉
这个是类似触发器的协处理器,之后再将类似存储过程的协处理器。
我们先来写一个极其简单的示例,用来快速了解这个东西是啥玩意。
package com.isesol.storm;
import java.io.IOException;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.client.Durability;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
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.filter.BinaryComparator;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.regionserver.RegionScanner;
import org.apache.hadoop.hbase.regionserver.wal.WALEdit;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver;
public class observTrigger extends BaseRegionObserver {
/* get, 如果 rowkey为admin,那么不返回数据 */
@Override
public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, final Get get, final List<Cell> results)
throws IOException {
if (Bytes.equals(get.getRow(), Bytes.toBytes("admin"))) {
/*
* Cell c = CellUtil.createCell(get.getRow(), Bytes.toBytes("cf"),
* Bytes.toBytes("name"), System.currentTimeMillis(), (byte) 4,
* Bytes.toBytes("1111"));
*
* results.add(c);
*/
e.bypass();
}
}
@Override
public RegionScanner preScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> e, final Scan scan,
final RegionScanner s) throws IOException {
scan.setRowPrefixFilter(Bytes.toBytes("fuck"));
return s;
}
@Override
public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e, final Put put, final WALEdit edit,
final Durability durability) throws IOException {
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum",
"datanode01.isesol.com:2181,datanode02.isesol.com:2181,datanode03.isesol.com:2181,datanode04.isesol.com:2181");
conf.set("hbase.zookeeper.property.clientPort", "2181");
HTable table = new HTable(conf, "test2");
Put put01 = new Put(put.getRow());
put01.add(Bytes.toBytes("cf"), Bytes.toBytes("name"), Bytes.toBytes("xxx"));
table.put(put);
table.close();
}
}
以上写了3个示例,get, scan 实现权限控制,put实现表同步(二级索引的做法和这个是一样的)
加载coprocessor:
alter 'test1' , METHOD => 'table_att', 'COPROCESSOR'=> 'hdfs://nameservice1/tmp/observeTrigger.jar|com.isesol.storm.observTrigger||'
取消加载:
alter 'test1' , METHOD => 'table_att_unset', NAME=> 'coprocessor$1'
这里主要讲一下碰到的问题:
1. 通过继承虚拟类来实现 协处理器,不要去继承接口
2. 在加载协处理器碰到一个问题,如果一个表加载协处理器之后,修改协处理器好像不会生效,我最后通过删除表,然后重新加载才起作用,不知道这里是否为BUG
3. 协处理器需要经过严格的测试,小心使用,一旦协处理器有问题, 这个玩意会导致regionserver全部down掉,或者某个regionserver down掉
这个是类似触发器的协处理器,之后再将类似存储过程的协处理器。
相关文章推荐
- HBase - Filter - 过滤器的介绍以及使用 | 那伊抹微笑
- 在Hbase Endpoint Coprocessor中使用coprocessorProxy操作例子与问题解析
- HBase - 计数器 - 计数器的介绍以及使用 | 那伊抹微笑
- HBase - 计数器 - 计数器的介绍以及使用 | 那伊抹微笑
- HBase - Filter - 过滤器的介绍以及使用 | 那伊抹微笑
- HBase - Filter - 过滤器的介绍以及使用 | 那伊抹微笑
- HBase - Coprocessor - 协处理器之观察者Observer(触发器)的介绍以及使用 | 那伊抹微笑
- HBase - Filter - 过滤器的介绍以及使用 | 那伊抹微笑
- HBase 1.x Coprocessor使用指南
- Data Access Application Block(Enterprise Library 3.1)的下载以及使用方法介绍
- hbase coprocessor 源码分析
- 今天为大家介绍下Android的下拉单使用方法(Spinner),以及效果图。
- 关于datagrid的使用以及动态修改,以及使用存储过程的介绍
- Android Resource介绍和使用以及bug记录
- delphi的专家工具Gexperts以及使用介绍
- hbase coprocessor的分析
- Log4j 的使用以及简单介绍
- RPM以及命令使用介绍
- C#关于log4net(Log For Net)的使用 简单说明以及介绍
- 一篇介绍如何使用XAMPP以及PDT开发PHP环境搭建的文章