HBase协处理器三种加载方式

一、协处理器简介

HBase协助处理器允许用户将部分逻辑在数据存放端即 HBase RegionServer 服务端进行计算,也即允许用户在 RegionServer 运行用户自定义的代码。这相当于是将计算推送到 RegionServer,实现了Region层面的并发,这将大大减少服务器和客户的的数据通信开销,从而提高 HBase 的计算性能。

这使得协处理器在加法计算或者聚合操作(求和、计数等)场景下非常高效。
此外,利用协处理器还可以构建HBase二级索引,一定程度上弥补了HBase单行键索引查询的缺点。

协助处理器的分类如下图所示,可分为观察者(Observer) 和 终端 (Endpoint) 。
在这里插入图片描述
Observer 提供了一些设计好的回调函数(钩子),类似于关系数据库的触发器。

在一些特定的事件发生时被执行,这些事件包括用户产生的事件,也包括服务器内部产生的事件。比如:put 操作之前有钩子函数 prePut(),该函数在 put 操作执行前会被 Region Server 调用;在 put 操作之后则有钩子函数 postPut()。

Endpoint 自定义操作添加到服务器端,有点像存储过程。

Endpoint 和 RDMBS 的存储过程很类似,用户提供一些自定义代码,并在 HBase 服务器端执行(“移动计算而非移动数据”的思想),结果通过 RPC 返回给客户,Endpoint 可以实现 min、 max、 avg、 sum、 distinct、 group by 等功能。

二、协处理器加载

完成协处理器的实现后需要将协处理器打包,对于协处理器的加载通常有三种方法,下面将展开介绍。

其中,1和3都需要将协处理器jar文件放到集群的HBase的classpath中。而2方法只需要将jar文件上传至集群环境的HDFS即可。

2.1 配置文件加载(静态加载)

即通过hbase-site.xml文件配置加载,一般这样的协处理器是系统级别的,全局的协处理器,如权限控制等检查。
启用协处理器Aggregation(Enable Coprocessor Aggregation)静态加载。
启用全局aggregation,能过操纵所有的表上的数据。通过修改hbase-site.xml这个文件来实现,只需要添加如下代码:

<property>
	<name>hbase.coprocessor.user.region.classes</name>
	<!-- 下面这是HBase自带的一个聚合coprocessor类 -->
	<value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value>
</property>

2.2 Shell加载(动态加载)

可以通过alter命令来对表进行scheme进行修改来加载协处理器。步骤如下:
1.创建hbase表

hbase(main):001:0> create 'coprocessor_table','F'
0 row(s) in 1.5290 seconds

=> Hbase::Table - coprocessor_table

2.通过alter命令将协处理器加载到表中
加载:

alter 'table_name', METHOD =>'table_att','coprocessor'=>'hdfs:///tmp/MyRegionServer.jar|com.lh.MyRegionObserver|1001'
alter 'coprocessor_table', METHOD =>'table_att','coprocessor'=>'hdfs:///tmp/MyRegionServer-1.0-SNAPSHOT.jar|com.lh.MyRegionObserver|1001'

卸载:

alter 'coprocessor_table', METHOD=>'table_att_unset',NAME=>'coprocessor$1'

2.3 通过API代码实现(动态加载)

即通过API的方式来加载协处理器。

/**
 * 加载协处理器
 *
 * @param tableName
 * @param className   协处理器的完整类名
 * @param jarFilePath 协处理器Jar包路径,要保证所有的RegionServer可读取到。也可以是本地路径,不过建议是放在HDFS上
 * @throws IOException
 */
public void loadCoprocessor(String tableName, String className, Path jarFilePath) throws IOException {
	TableName thisTableName = TableName.valueOf(tableName);

	// 获取当前表的HTableDescriptor对象
	Table table = getHbaseConnection().getTable(thisTableName);
	try {
		// 判断表是否存在,若存在加载协处理器
		if (!tableExists(tableName)) {
			log.info("Table " + tableName + " is not exists. Nothing to do.");
		} else {
			HTableDescriptor tableDescriptor = table.getTableDescriptor();
			log.info("Load Coprocessor To Table: " + tableDescriptor.getTableName());

			hbaseAdmin.disableTable(thisTableName);
			/**
			 *
			 * priority:协处理器优先级,整数表示,可以为空
			 * kvs:传递给协处理器的参数,可以为空
			 */
			int priority = 0;
			Map<String, String> kvs = null;
			tableDescriptor.addCoprocessor(className, jarFilePath, Coprocessor.PRIORITY_LOWEST, kvs);

			hbaseAdmin.modifyTable(thisTableName, tableDescriptor);
			log.info("Table " + tableName + " is modified successfully.");
		}
	} catch (IOException e) {
		log.info("The coprocessor has been loaded");
		e.printStackTrace();
	} finally {
		hbaseAdmin.enableTable(thisTableName);
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值