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

HBase协处理器

0条评论2,910次浏览

简介

使用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
  • 文章总数:79篇
  • 评论总数:402条
  • 分类总数:31个
  • 标签总数:44个
  • 运行时间:1013天

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

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

最新评论
  • 晴子: 在主节点初始化CM5数据库的时候报错误:Verifying that we can write to /opt/cm-5.9.0/etc/cloudera-scm -server log4j:ERROR Could not...
  • zhangnew: 就4题 :?:
  • linxh: “ 但要是遇到预先并不知道数组的长度而又需要获取正确的(或者称之 为原始的)split长度时,该如何处理呢。。? ” 印象中可以split函数参数传-1?
  • linxh: 班门弄斧一下: ssh host cmd 和直接ssh上后cmd结果不一样是因为ssh直接运行远程命令 是非交互非登录模式与ssh上去得到一个登录交互式Shell二 者加载的环境变量不一样。
  • 匿名: 其实文本分类和数字分类是一样的,只是文本分类需要多一个步骤, 就是计算它的tf-idf值将其转换为double类型
  • yurnom: 可能苹果最近又改变了返回值吧,最近没做测试了。 BadDeviceToken一般测试环境和正式环境弄错的情况 下会出现。
  • Anonymous: :razz: 博主,良心贴啊, 最近也在弄apns推送。 有个问题想请教你一下啊。 你博客中写的 Unregistered 错误,有准确的说明吗, 我看你博客中写的:...
  • 一波清泉: 回复邮箱: 1004161699@qq.com 多谢
  • Anonymous: 17/02/09 01:15:02 WARN Utils: Service ‘SparkUI’ could not bind on port 4040. Attempting port...
  • 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