HBase 协处理器总结
1. 协处理器是什么
1.1 概述
- 理解为服务端的拦截器,可根据需求确定拦截点,再重写这些拦截点对应的方法
- 协处理器允许在region server上运行自己的代码,更准确地说是允许用户执行 region级的操作,并且可以使用与RDBMS中触发器(trigger)类似的功能
- 协处理器分两种类型,系统协处理器可以全局导入region server上的所有数据表,表协处理器即是用户可以指定一张表使用协处理器。协处理器框架为了更好支持其行为的灵活性,提供了两个不同方面的插件。
- 一个是观察者(observer),类似于关系数据库的触发器。
- 另一个是终端(endpoint),动态的终端有点像存储过程。Observer : 在region server上执行,而且是自动执行Endpoint: 在region server上执行,但是要由客户端通过请求来调用执行
1.2 观察者Observers
- RegionObserver:针对Region的观察者,可以监听关于Region的 操作。
- RegionServerObserver:针对RegionServer的观察者,可以监听 整个RegionServer的操作。
- MasterObserver:针对Master的观察者,可以监听Master进行的 DDL操作。
- WALObserver:针对WAL的观察者,可以监听WAL的所有读写操 作。
- BulkLoadObserver:BulkLoad是采用MapReduce将大量数据快速 地导入HBase的一种方式。BulkLoadObserver可以监听BulkLoad行为。
- EndpointObserver:可以监听EndPoint的执行过程。在此我并没有列出这些接口的所有基本实现类,只列出最常用的两种基本实现类:BaseRegionObserver:实现了RegionObserver接口的所有需要实 现的方法,并给出了最简单实现。
- BaseMasterObserver:实现了MasterObserver接口的所有需要实 现的方法,并给出了最简单的实现。
1.3 终端
- 只有一个接口CoprocessorService,并且没有提供基本的实现类。 该接口只有一个方法需要实现:getService,该方法需要返回Protocol Buffers(Google开发的第三方库,用来实现一种数据传输格式,类似 XML,但是比XML更节省传输资源)的Service实例,所以实现Endpoint 之前,还需要了解一下Protocol Buffers的相关知识作为基础。
- protobuf 简单介绍 github 地址,可以看出,就是一个高效的序列化框架。
1.4 应用
- Hbase作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和、计数、排序等操作。比如,在旧版本的(<0.92)Hbase中,统计数据表的总行数,需要使用 Counter 方法,执行一次 MapReduce Job 才能得到。
- 虽然 HBase在数据存储层中集成了 MapReduce,能够有效用于数据表的分布式计算。然而在很多情况下,做一些简单的相加或者聚合计算的时候,如果直接将计算过程放置在 server 端,能够减少通讯开销,从而获得很好的性能提升。
- 所以,协处理器可以看作是将运算放在region server来处理的一种提升运算速度的方式
1.5 基本使用
- 编写协处理器打包成jar包上传到HDFS中
- 加载协处理器
1.5.1 静态加载,全局加载
- 修改hbase配置文件 hbase-site.xml,启动全局aggregation,操作所有表上数据。
<property>
<name>hbase.coprocessor.user.region.classes</name>
<value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value>
</property>
1.5.2 动态加载
- 先将开发好的协处理器类打成jar包,并上传到hdfs的某个目录
- 禁用目标表 disable ‘star’
- 修改目标表的Coprocessor属性
hbase alter 'users', METHOD => 'table_att', 'Coprocessor'=>'hdfs://<namenode>:<port>/user/<hadoop-user>/coprocessor.jar| org.myname.hbase.Coprocessor.RegionObserverExample|1073741823| arg1=1,arg2=2'
‘users’ 拦截的目标表
METHOD => ‘table_att’ 这个表示alter命令要对users表做属性修改操作
hdfs://:/user//coprocessor.jar 协处理器类所在的jar包
org.myname.hbase.Coprocessor.RegionObserverExample 自定义的协处理器实现类
1073741823 协处理器的执行顺序号,可以为任意数值,小的会优先执行
arg1=1,arg2=2 自定义协处理器所需要的参数
- 加协处理器导致集群崩溃,可以尝试这样拯救
- 修改hbase-site.xml,加入如下配置
<property>
<name>hbase.table.sanity.checks</name>
<value>false</value>
</property>
1.5.4 卸载协处理器
- 禁用表
disable 'mytable'
- 卸载
alter 'mytable',METHOD=>'table_att_unset',NAME=>'coprocessor$1'
- 启用表
enable 'mytable'
2. 二级索引案例
- pom文件
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-auth