HBase Coprocessor 剖析与编程实践.docx_第1页
HBase Coprocessor 剖析与编程实践.docx_第2页
HBase Coprocessor 剖析与编程实践.docx_第3页
HBase Coprocessor 剖析与编程实践.docx_第4页
HBase Coprocessor 剖析与编程实践.docx_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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章节。图1RegionObserver工作原理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这个文件来实现,只需要添加如下代码: hbase.coprocessor.user.region.classes org.apache.hadoop.hbase.coprocessor.AggregateImplementation 2.启用表aggregation,只对特定的表生效。通过HBase Shell 来实现。(1)disable指定表。hbase disable mytable(2)添加aggregationhbase alter mytable, METHOD = table_att,coprocessor=|org.apache.hadoop.hbase.coprocessor.AggregateImplementation|(3)重启指定表hbase enable mytable4.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);5.参考文献(References)1Lai, et al.,(2012-02-01),Coprocessor Introduction : Apache HBase.Ava

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论