引言
 

假设HBase某张表有1000个Region,里面存储着100万行数据,现在需要统计满足某些条件的行数,普通的做法是使用Filter(过滤条件),通过HBase API将满足过滤条件的行数据Scan至客户端之后进行汇总,这需要在HBase RegionServer与Client之间传送大量的数据,占用大量的网络带宽,并影响响应时间。

 
这是一种典型的“移动数据”的计算方案,即将所有数据传送到计算节点后进行计算,熟悉Hadoop MapReduce的人知道,MR使用的是“移动计算”,即将计算任务传送到存储数据的节点,由这些节点负责完成计算流程,仅仅只返回计算的结果,这些节点与客户端之间仅仅需要传送各自的结果数据即可,减少网络带宽的同时,很大程度提高响应时间。
 
对应统计行数的例子,如果我们能够将计算任务(过滤数据、汇总结果)传送至HBase中存储这些数据的Region中,由这些Region完成各自的计算任务(过滤数据、汇总结果),然后将各自的结果(每个Region中满足条件的行数)返回至客户端,由客户端对这些结果(1000个Region会返回1000个整数)进行求和,即可得出最后的满足条件的总行数。可以看出这种方式是一种理想的计数方式。
 
但这仅仅是我们的一种设想,HBase并不能够提前知道我们的需求是统计行数,它无法事先为我们内置这样的API,但按照我们设想的这种方式的确可以大大提高程序处理效率,而且在计数、求和、求平均值、求最大值、求最小值,甚至更为复杂的包含过滤条件的分组统计场景中(这些场景中仅仅需要由各个Region返回少量的数据,再由客户端口对这些数据进行汇总即可),能够避免大量的数据传输,提高程序处理效率,减少系统响应时间。
 
Endpoint
 
HBase Endpoint(Coprocessor)就是为实现这一目的而设计的,它支持自定义逻辑,并通过RPC机制进行调用,也可以理解为自定义扩展RPC Protocol。
 
实现一个Endpoint(即自定义一个RPC Protocol)涉及到以下两个步骤:
 
(1)创建自定义RPC Protocol接口,并继承接口CoprocessorProtocol,其中自定义RPC Protocol接口中的方法表示Client与Region的交互协议;
 
(2)实现自定义RPC Protocol接口,并继承类BaseEndpointCoprocessor,其中自定义RPC Protocol接口中的方法实现表示Client与Region的交互细节。
 
CoprocessorProtocol实例是与具体的单个Region相关联的,Client进行RPC请求时必须能够识别出应该在相应表的哪些Regions上发起CoprocessorProtocol实例方法调用,然而Region相关操作很少被Client直接处理,且Region的名称和数目经常变化,因此Endpoint使用RowKey来识别这些Regions,具体表现在HTable的三个API,如下:
 
<T extends CoprocessorProtocol> T coprocessorProxy(Class<T> protocol, byte[] row)
 
这个API使用在单个Region的场景,这个Region满足的条件是包含数据行row。
 
<T extends CoprocessorProtocol, R> Map<byte[],R> coprocessorExec(Class<T> protocol, byte[] startKey, byte[] endKey, Batch.Call<T,R> callable)
 
<T extends CoprocessorProtocol, R> void coprocessorExec(Class<T> protocol, byte[] startKey, byte[] endKey, Batch.Call<T,R> callable, Batch.Callback<R> callback)
 
这两个API使用在多个Region的场景,这些Region满足的条件是包含startKey——endKey范围内所有数据行的Regions。
 
以统计行数为例,调用过程如下图所示:
 
 
关于Endpoint的具体实现细节及部署方式,请参考《HBase The Definitive Guide》相关章节。
 
应用场景
 
在使用HBase Endpoint过程中,Region的识别由RowKey决定,而数据的过滤则通过设置Filter实现,如下所示:
 
long getRowCount(Filter filter) throws IOException
 
这样Region中的数据就可以通过filter进行过滤。
 
注意:Filter是在发起RPC请求之前就准备好的,作为自定义RPC Protocol的参数。
 
计数
 
各个Region返回的是各自Region(满足条件)的数据行数,Client仅需要求和即可。
 
最大值
 
各个Region返回的是各自Region的数据最大值,Client仅需要在这些返回的值中找出最大值即可。
 
最小值
 
各个Region返回的是各自Region的数据最小值,Client仅需要在这些返回的值中找出最小值即可。
 
求和
 
各个Region返回的是各自Region数据的和,Client仅需要对这些值求和即可。
 
求平均值
 
各个Region返回的是各自Region的数据行数及总和,Client需要对每个Region的数据行数及总和进行汇总,然后得出平均值。
 
以上都是一些比较简单的场景,主要用以说明问题而已,可以通过对RowKey、EndPoint RPC Protocol的合理设计,完成更为复杂的分组统计。

HBase Endpoint的更多相关文章

  1. HBase EndPoint加载失败

    概述 参考博客(http://blog.csdn.net/carl810224/article/details/52224441)编写EndPoint协处理器,编写完成后使用Maven打包(使用ass ...

  2. [How to] 使用HBase协处理器---Endpoint客户端代码的实现

    1.简介 不同于Observer协处理器,EndPoint由于需要同region进行rpc服务的通信,以及客户端出数据的归并,需要自行实现客户端代码. 基于[How to] 使用HBase协处理器-- ...

  3. [How to] 使用HBase协处理器---Endpoint服务端的实现

    1.简介 前篇文章[How to] 使用HBase协处理器---基本概念和regionObserver的简单实现中提到了两种不同的协处理器,并且实现了regionObserver. 本文将介绍如何使用 ...

  4. hbase协处理器编码实例

    Observer协处理器通常在一个特定的事件(诸如Get或Put)之前或之后发生,相当于RDBMS中的触发器.Endpoint协处理器则类似于RDBMS中的存储过程,因为它可以让你在RegionSer ...

  5. 从零自学Hadoop(22):HBase协处理器

    阅读目录 序 介绍 Observer操作 示例下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,Sour ...

  6. HBase设计与开发性能优化(转)

    本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,这里涉及的不多,这部分可以参考:淘宝Ken Wu同学的博客. 1. 表的设计 1.1 Pr ...

  7. hbase 协处理器

    一.服务端1.安装Protobuf2.RPC proto 定义文件:Examples.protooption java_package = "org.apache.hadoop.hbase. ...

  8. 基于Solr实现HBase的二级索引

    文章来源:http://www.open-open.com/lib/view/open1421501717312.html 实现目的: 由于hbase基于行健有序存储,在查询时使用行健十分高效,然后想 ...

  9. HBase(一): c#访问hbase组件开发

    HDP2.4安装系列介绍了通过ambari创建hbase集群的过程,但工作中一直采用.net的技术路线,如何去访问基于Java搞的Hbase呢? Hbase提供基于Java的本地API访问,同时扩展了 ...

随机推荐

  1. 阿里云服务器[教程3]一键安装php+mysql+ftp+nginx环境

    直接看地址 http://help.aliyun.com/manual?spm=0.0.0.0.F5PPZs&helpId=129

  2. [Firebase] Deploy you website to Firebase

    If you are looking for a host website, you can try Firebase, heroku or AWS... Today, I tried to depl ...

  3. Android系统移植与驱动开发--第四章

    第四章 源代码的下载和编译 一个android内核相当于4G,而一个Linux内个只有几百M,Linux内核相对于android内核来说实在是小巫见大巫.了解android源代码不一定要详细了解,只去 ...

  4. Day6 - Python基础6 面向对象编程

    Python之路,Day6 - 面向对象学习   本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.     引子 你现在是一家游戏公司的开发 ...

  5. dedecms网站文章标题与简标题的调用问题

    使用dedecms调用标签的时候,既然有,咱们就合理利用,如果没有,咱也可以自己去添加.以下介绍dedecms网站文章标题调用的一些技巧,希望大家能够合理运用. dedecms网站文章标题与简标题的调 ...

  6. C# 自定义线程修改UI(一)

    在Wpf中界面显示数据的修改,都是通过UI线程完成,如果尝试从其他线程中直接修改控件的值回抛出异常,“调用线程无法访问此对象,因为另一个线程拥有该对象”. 例如:http://www.cnblogs. ...

  7. Ajax数据格式,html,xml,json

    1. 2. 3. 4. 5. 6. 7. 8. 9.

  8. Cacti添加threshold、monitor和setting

    Cacti版本:Version 0.8.8b 一.插件介绍: monitor:通过简单明了的图标提供服务器的运行状态 settings:给不同的插件提供一些共用的信息,如邮件信息,dns信息thold ...

  9. XMLHelper 类

     这个XMLHelper类中包括了XML文档的创建,文档节点和属性的读取,添加,修改,删除的方法功能的实现,有兴趣的朋友,可以进来看看,所有代码都在WebForm和WinForm中调试通过. 这是下面 ...

  10. C++工厂方法模式

    class IFactoryBase { public: IFactoryBase(void); virtual ~IFactoryBase(void); public: virtual IProdu ...