HBase CoProcessor介绍以及使用

本文介绍了HBase协处理器的基本概念,并提供了三个示例代码:实现get操作的权限控制、scan操作的过滤及put操作的数据同步。同时分享了开发过程中遇到的问题及注意事项。

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掉

这个是类似触发器的协处理器,之后再将类似存储过程的协处理器。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tom_fans

谢谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值