程序员的自我修养
Home » Apache HBase » HBase协处理器

HBase协处理器

0条评论2,658次浏览

简介

使用Scan的时候,可以配合各种Filter进行数据的筛选以减少返回的数据量,同样也可以通过选择特定的列族和列来减少返回的数据量。若是能将该特性进一步的优化则HBase会更强大,例如将客户端的代码分发到各个HRegionServer上执行,好比MapReduce一样的执行任务,执行完后返回的结果相信数据量会更小。HBase在0.92版本后引入了协处理器来实现该功能。

使用协处理器的好处是显而易见的,可以将运算放至Server端,减少通信开销的同时还能有效的提升性能。但同样的也会存在一些风险:由于协处理器目前还没有与主要的HBase进程隔离开来,若协处理器崩溃可能导致进程崩溃。

协处理器分类两类:Observer和Endpoint。可以分别对应成关系型数据库中的触发器和存储过程。

Observer

Observer类的协处理器在特定的事件发生时执行回调函数(也被称为钩子函数,hook),这些事件可以是用户产生的事件,也可以是服务器端产生的事件。

Observer分类以下三类:

  • RegionObserver:提供客户端的数据操纵事件钩子,与表的region紧密关联
  • MasterObserver:提供DDL类型的操作钩子,为集群级事件
  • WALObserver:提供WAL相关操作钩子

RegionObserver详解

RegionObserver当一个特定的region级别的操作发生时,相应的钩子函数会被触发。这些操作分为两类:

  • region生命周期变化。主要接口:
    • void preOpen(..)/void postOpen(..):在region打开前/后调用
    • void preWALRestore(..)/void postWALRestore(..):在WAL日志restore前/后调用
    • void preFlush(..)/void postFlush(..):flush前/后调用
    • void preCompact(..)/void postCompact(..):compact前/后调用
    • void preSplit(..)/void postSplit(..):split前/后调用
    • void preClose(..)/void postClose(..):cloase前/后调用
  • 客户端API调用。主要接口:
    • void preGet(..)/void postGet(..)
    • void prePut(..)/void postPut()
    • void preDelete()/void postDelete()
    • void preCheckAndPut(..)/void postCheckAndPut(..)
    • etc.

代码示例

preGet(..),当调用get前触发。若主键为“#time#”,则返回当前的时间。preSplit(..),当region进行split前调用,e.bypass()表示停止当前服务进程的处理过程,此时代表禁止自动split。

RegionObserver时序图
sequence diagram of RegionObservers

MasterObserver

MasterObserver为处理master服务器的所有回调函数,而HMaster负责的内容为创建表、删除表之类的类似关系型数据库中的DDL操作。

MasterObserver提供的接口:

  • void preCreateTable(..)/void postCreateTable(..): 创建表前/后调用
  • void preDeleteTable(..)/void postDeleteTable(..):删除表前/后调用
  • void preDisableTable(..)/void postDisableTable(..):disable表前/后调用
  • etc.

WALObserver

WALObserver提供WAL相关的钩子函数,提供的接口:

  • void preWALWrite(..)/void postWALWrite(..):WAL写前/后调用

Endpoint

Endpoint类似于关系型数据库中的存储过程,只不过这个存储过程会运行在多个region上。

终端是动态RPC插件的接口,它的实现代码被安装在服务器端,从而能够通过HBase RPC唤醒。客户端类库提供了非常方便的方法来调用这些动态接口,它们可以在任意时候调用一个终端,它们的实现代码会被目标region远程执行,结果会返回到终端。用户可以结合使用这些强大的插件接口,为HBase添加全新的特性。

Endpoint的使用需要经过如下步骤(示例为计算某列的sum值):

  1. 定义一个新的protocol接口,并继承CoprocessorProtocol
  2. 继承抽象类BaseEndpointCoprocessor,并实现已定义的接口

  3. 客户端调用定义好的方法

客户点调用Endpoint的方法有三种方式:

整体的Endpoint加载过程范例
Endpoint

协处理器加载

协处理器的加载分两种形式,配置文件加载和Shell命令加载。

配置文件加载

编辑hbase-site.xml文件,添加:

配置文件中的配置项决定了该协处理器的执行顺序。修改完配置文件后,需将相应的jar包放入hbase-env.sh中的HBASE——CLASSPATH中,然后重启HBase来使配置生效。

Shell命令加载

Shell命令加载也就是从表描述符中加载,其中键必须以COPROCESSOR开头,值必须符合以下格式:<path-to-jar>|<classname>|<priority>。例如:

其中priority只能为SYSTEM或者USER。

参考资料

(转载本站文章请注明作者和出处 程序员的自我修养 – SelfUp.cn ,请勿用于任何商业用途)
分类:Apache HBase
标签:
发表评论


profile
  • 文章总数:78篇
  • 评论总数:252条
  • 分类总数:31个
  • 标签总数:43个
  • 运行时间:946天

大家好,欢迎来到selfup.cn。

这不是一个只谈技术的博客,这里记录我成长的点点滴滴,coding、riding and everthing!

最新评论
  • pacificLee: :twisted:
  • 小码: 为什么没有后面的呢,只有前10个
  • Anonymous: :lol:
  • Anonymous: :razz: 楼主是属于会聊天的。 我想问,sqoop发了几个版本了,应该没这些问题了吧。
  • Anonymous: Config.kafkaConfig.kafkaGroupI d 这个是指自己配置的group id 还是从 import org.apache.kafka.common.config .Config 这个类...
  • Anonymous: ZkUtils.getPartitionsForTopics (zkClient, Config.kafkaConfig.topic) 那个方法是在 spark-streaming_2.10 中 kafka...
  • Anonymous: ZkUtils.getPartitionsForTopics (zkClient, Config.kafkaConfig.topic) 你确定 kafka 里面有这个类 ? 个人在kafka 最新 稳定版...
  • Anonymous: :roll:
  • Anonymous: 很不错,试问有java版的吗?
  • Anonymous: 赞
  • Anonymous: 哈哈 看楼主的吐槽乐死了 where子句是可以写的 同样找不到资料 一点点试出来的 select id from xxxx where ${CONDITIONS} and 1=1 and 2=2 limit 4
  • EVIL: 我在运行完C4.5的代码后,显示 defined object DecisionTreeTest 是什么意思?这是有错误吗?运行结果在哪里看?
  • sf: 楼主的问题,我都遇到。。。没办法项目已经定型了,最后都硬着头 皮一个一个的改了源码
  • zz: 我去,楼主你真及时,我们今天上了新的HTTP2 push之后也发现速度曲线很奇怪,开始有200k/min,跟 另一台老的推送协议速度差不多,但是过了一会,立马降到只有几k /min,百思不得其解,我们还用了一个海外代理,在...
  • qi365: :mad: 很可恶,百度助纣为虐~
  • qi365: :? :shock: haha~ very good~
  • 张是大: 《深入浅出Spark机器学习实战(用户行为分析)》 课程网盘下载:http://pan.baidu.com/s/ 1mixvUli 密码:1pfn
  • Anonymous: :???:
  • Anonymous: 我用着sqoop感觉还可以,select 几十个字段也没事,估计是版本低。。
  • Anonymous: :grin: