1.起因(Why HBase  Coprocessor)

HBase作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和、计数、排序等操作。比如,在旧版本的(<0.92)Hbase中,统计数据表的总行数,需要使用Counter方法,执行一次MapReduce Job才能得到。虽然HBase在数据存储层中集成了MapReduce,能够有效用于数据表的分布式计算。然而在很多情况下,做一些简单的相加或者聚合计算的时候,如果直接将计算过程放置在server端,能够减少通讯开销,从而获得很好的性能提升。于是,HBase在0.92之后引入了协处理器(coprocessors),实现一些激动人心的新特性:能够轻易建立二次索引、复杂过滤器(谓词下推)以及访问控制等。

2.灵感来源( Source of Inspration)

HBase协处理器的灵感来自于Jeff Dean 09年的演讲( P66-67)。它根据该演讲实现了类似于bigtable的协处理器,包括以下特性:

  • 每个表服务器的任意子表都可以运行代码
  • 客户端的高层调用接口(客户端能够直接访问数据表的行地址,多行读写会自动分片成多个并行的RPC调用)
  • 提供一个非常灵活的、可用于建立分布式服务的数据模型
  • 能够自动化扩展、负载均衡、应用请求路由
HBase的协处理器灵感来自bigtable,但是实现细节不尽相同。HBase建立了一个框架,它为用户提供类库和运行时环境,使得他们的代码能够在HBase region server和master上处理。

3.细节剖析(Implementation)

协处理器分两种类型,系统协处理器可以全局导入region server上的所有数据表,表协处理器即是用户可以指定一张表使用协处理器。协处理器框架为了更好支持其行为的灵活性,提供了两个不同方面的插件。一个是观察者(observer),类似于关系数据库的触发器。另一个是终端(endpoint),动态的终端有点像存储过程。

3.1观察者(Observer)

观察者的设计意图是允许用户通过插入代码来重载协处理器框架的upcall方法,而具体的事件触发的callback方法由HBase的核心代码来执行。协处理器框架处理所有的callback调用细节,协处理器自身只需要插入添加或者改变的功能。

以HBase0.92版本为例,它提供了三种观察者接口:

  • RegionObserver:提供客户端的数据操纵事件钩子:Get、Put、Delete、Scan等。
  • WALObserver:提供WAL相关操作钩子。
  • MasterObserver:提供DDL-类型的操作钩子。如创建、删除、修改数据表等。

这些接口可以同时使用在同一个地方,按照不同优先级顺序执行.用户可以任意基于协处理器实现复杂的HBase功能层。HBase有很多种事件可以触发观察者方法,这些事件与方法从HBase0.92版本起,都会集成在HBase API中。不过这些API可能会由于各种原因有所改动,不同版本的接口改动比较大,具体参考Java Doc。

RegionObserver工作原理,如图1所示。更多关于Observer细节请参见HBaseBook的第9.6.3章节。

图1 RegionObserver工作原理

3.2终端(Endpoint)

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

  1. 定义一个新的protocol接口,必须继承CoprocessorProtocol.
  2. 实现终端接口,该实现会被导入region环境执行。
  3. 继承抽象类BaseEndpointCoprocessor.
  4. 在客户端,终端可以被两个新的HBase Client API调用 。单个region:HTableInterface.coprocessorProxy(Class protocol, byte[] row) 。rigons区域:HTableInterface.coprocessorExec(Class protocol, byte[] startKey, byte[] endKey, Batch.Call callable)

整体的终端调用过程范例,如图2所示:

图2 终端调用过程范例

4.编程实践(Code Example)

在该实例中,我们通过计算HBase表中行数的一个实例,来真实感受协处理器 的方便和强大。在旧版的HBase我们需要编写MapReduce代码来汇总数据表中的行数,在0.92以上的版本HBase中,只需要编写客户端的代码即可实现,非常适合用在WebService的封装上。

4.1启用协处理器 Aggregation(Enable Coprocessor Aggregation)

我们有两个方法:1.启动全局aggregation,能过操纵所有的表上的数据。通过修改hbase-site.xml这个文件来实现,只需要添加如下代码:

<property> <name>hbase.coprocessor.user.region.classesname> <value>org.apache.hadoop.hbase.coprocessor.AggregateImplementationvalue> property>

2.启用表aggregation,只对特定的表生效。通过HBase Shell 来实现。

(1)disable指定表。hbase> disable 'mytable'

(2)添加aggregation hbase> alter 'mytable', METHOD => 'table_att','coprocessor'=>'|org.apache.hadoop.hbase.coprocessor.AggregateImplementation||'

(3)重启指定表 hbase> enable 'mytable'

4.2统计行数代码(Code Snippet)

public class MyAggregationClient {private static final byte[] TABLE_NAME = Bytes.toBytes("mytable");private static final byte[] CF = Bytes.toBytes("vent"); public static void main(String[] args) throws Throwable {Configuration customConf = new Configuration();customConf.setStrings("hbase.zookeeper.quorum","node0,node1,node2"); //提高RPC通信时长 customConf.setLong("hbase.rpc.timeout", 600000); //设置Scan缓存 customConf.setLong("hbase.client.scanner.caching", 1000);Configuration configuration = HBaseConfiguration.create(customConf);AggregationClient aggregationClient = new AggregationClient(configuration);Scan scan = new Scan(); //指定扫描列族,唯一值scan.addFamily(CF); long rowCount = aggregationClient.rowCount(TABLE_NAME, null, scan);System.out.println("row count is " + rowCount);}
}
原文地址:http://www.cnblogs.com/ventlam/archive/2012/10/30/2747024.html

5.参考文献(References)

[1]Lai, et al.,(2012-02-01),"Coprocessor Introduction : Apache HBase".Available:https://blogs.apache.org/hbase/entry/coprocessor_introduction

[2]Apache.(2012-08-10),"The Apache HBase  Reference Guide".Available:http://hbase.apache.org/book.html#coprocessors

HBase的两种协处理器相关推荐

  1. Hbase表两种数据备份方法-导入和导出示例

    Hbase表两种数据备份方法-导入和导出示例 本文将提供两种备份方法 -- 1) 基于Hbase提供的类对hbase中某张表进行备份 2) 基于Hbase snapshot数据快速备份方法 场合:由于 ...

  2. spark sql hbase java_Spark 读写 HBase 的两种方式(RDD、DataFrame)

    使用 saveAsHadoopDataset 写入数据 import org.apache.hadoop.hbase.{HBaseConfiguration, HTableDescriptor, Ta ...

  3. spark从hbase读数据到存入hbase数据两种版本写法

    spark2版本: object SparkCoreTest {def main(args: Array[String]): Unit = {// 使用sparksession来创建对象val spa ...

  4. hive建立内部表映射hbase_Hive 建外链表到 Hbase(分内部表、外部表两种方式)

    一. Hive 建内部表,链到hbase :特点:Hive drop表后,Hbase 表同步删除 drop table if exists hbase_kimbo_test1; CREATE TABL ...

  5. shell和javaAPI两种方式创建hbase表并预分区

    在hbase里面,如果我们建表不预分区,那么一个表的数据都会被一个region处理,如果数据过多就会执行region的split,如果数据量很大这样会很费性能,所以最好我们先根据业务的数据量在建表的时 ...

  6. NoSQL生态系统——hash分片和范围分片两种分片

    13.4 横向扩展带来性能提升 很多NoSQL系统都是基于键值模型的,因此其查询条件也基本上是基于键值的查询,基本不会有对整个数据进行查询的时候.由于基本上所有的查询操作都是基本键值形式的,因此分片通 ...

  7. string 中的offset_Kafka+Spark Streaming管理offset的两种方法

    ​Kafka配合Spark Streaming是大数据领域常见的黄金搭档之一,主要是用于数据实时入库或分析. 为了应对可能出现的引起Streaming程序崩溃的异常情况,我们一般都需要手动管理好Kaf ...

  8. RDD的两种操作(Transformation和Action)

    RDD创建后就可以在RDD上进行数据处理.RDD支持两种操作:转换(transformation),即从现有的数据集创建一个新的数据集:动作(action),即在数据集上进行计算后,返回一个值给Dri ...

  9. 8086的两种工作模式_8086系统中最小模式与最大模式两种工作方式的主要区别是什么?...

    展开全部 最小模式和最大模式的主要区别为以下几方面: 1.处理系统方面 最小模式:系统里e68a843231313335323631343130323136353331333366306533就808 ...

  10. Spark Streaming读取Kafka数据的两种方式

    Kafka在0.8和0.10之间引入了一种新的消费者API,因此,Spark Streaming与Kafka集成,有两种包可以选择: spark-streaming-kafka-0-8与spark-s ...

最新文章

  1. MySQL 学习笔记(9)— 事务控制语句、事务属性以及并发和隔离级别
  2. 清华贵系的期末大作业:奋战三周,造台计算机!
  3. springboot EnableAutoConfiguration
  4. 皮一皮:杯子不要买太奇怪的...
  5. oracle服务器环境建立,oracle 透明网关环境的建立
  6. phpmyadmin不允许一个表创建多个主键的解决办法
  7. 错失黄金时期、连年亏损,国美App改名也难“真快乐”
  8. 新手使用struts2,记一次struts2启动出错
  9. Ubuntu 15.10系统安装后要做的15件事
  10. 零基础数学建模学习日记Day1
  11. DB2学习之表误删除恢复
  12. Java调用kjb文件
  13. android sim卡应用程序,Android双SIM卡API
  14. UART、SPI、I2C串行通讯协议解释 同步/异步 全双工/半双工通信含义
  15. 2020支付行业七大预测:聚合支付牌照有望正式落地
  16. 2022-2028年全球与中国饲料核苷酸行业市场需求预测分析
  17. android中级培训,Android 中级学习心得
  18. nth-child的使用方法
  19. 别吃泡面啦,我们来泡个4D打印的机器人出来玩
  20. 直播APP开发公司、直播源码出售《直播疑难杂症排查系列》之 :播放失败

热门文章

  1. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_7 Mybatis中参数的深入-使用实体类的包装对象作为查询条件...
  2. 阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_07.环境搭建的注意事项
  3. 通过tomcat配置solr 4.10.3
  4. Qt学习笔记-更高级的文本编辑器-完善第一版-gif动画
  5. IE6之各种不适记录
  6. 两端“弱智”的HTML代码
  7. 支持一切积极向上的自发行为
  8. VMware虚拟机更换根用户( su: Authentication failure问题)
  9. 学校管理系统java(数据库、源码、演讲内容、ppt等)
  10. JS获取键盘码并判断按键