引言
 

假设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. 黑白图像(DFS)

    输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数.如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块.如图6-11所示的图形有3个八连块. 图6-11  拥有3 ...

  2. C++对象模型学习笔记

    1. 全局变量是如何初始化的 //global var A a; int main() { cout<<a<<endl; ; } 如上述例子,全局变量a是在main()函数之前 ...

  3. 4道过滤菜鸟的iOS面试题

    网上已经有很多针对各种知识点的面试题,面试时有些人未必真正理解也能通过背题看上去很懂.我自己总结了4道面试题,好快速的判断这个人是否是一个合格的工程师,欢迎大家点评. 1.struct和class的区 ...

  4. Javascript 控制style 小结

    style.top 如: c.style.top=scrollTop; 在IE各版本中可以,Safari, chrome, Firefox都不work, 需要在后面 + "px";

  5. Java基础知识强化之集合框架笔记12:Collection集合存储字符串并遍历

    1.  Collection集合存储字符串并遍历 分析: (1)创建集合对象 (2)创建字符串对象 (3)把字符串对象添加到集合中 (4)遍历集合 2. 代码示例: package cn.itcast ...

  6. POJ 2049 Finding Nemo

    Finding Nemo Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 8631   Accepted: 2019 Desc ...

  7. codevs2622数字序列( 连续子序列最大和O(n)算法)

    /* 算法描述:维护一个s[p]表示累加和 并且更新最大值ans 如果s[p]<0 则从p+1重新累加 证明:设某个区间的起点和终点分别为s t 分两种情况 1.t<p:设s2表示1到s的 ...

  8. Filter过滤器实现同一地址手机和电脑页面不同

    最近做一个网站,客户要求在访问主域名的时候实现电脑访问时展示电脑页面,手机访问时展示h5的手机页面,这种需求的使用还是比较多的:尤其网站需要百度推广的时候,百度推广就要求同一域名下,手机访问时展示手机 ...

  9. Effective java-泛型思维导图

  10. iOS中使用UIWebView与JS进行交互

    iOS中使用UIWebView与JS进行交互 前一段忙着面试和复习,这两天终于考完试了,下学期的实习也有了着落,把最近学的东西更新一下,首先是使用UIWebView与JS进行交互 在webView中我 ...