引言
 

假设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. POJ 1265 Area POJ 2954 Triangle Pick定理

    Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5227   Accepted: 2342 Description ...

  2. Python多进程使用

    [Python之旅]第六篇(六):Python多进程使用   香飘叶子 2016-05-10 10:57:50 浏览190 评论0 python 多进程 多进程通信 摘要:   关于进程与线程的对比, ...

  3. 关于 rem 作为单位设置大小

    rem是相对长度单位.相对于根元素(即html元素)font-size计算值的倍数htm{font-size: 62.5%;}根元素(html)先设置一个font-size,一般情况下为了容易计算re ...

  4. asp.net 从客户端中检测到有潜在危险的 Request.Form 值错误解

    从客户端(ftbContent="<P><A href="http://l...")中检测到有潜在危险的 Request.Form 值. 说明: 请求验 ...

  5. iOS开发中EXC_BAD_ACCESS的另类原因

    今天偶然学习iOS开发的时候碰到一个EXC_BAD_ACCESS的异常,经查资料得到的解释是由于访问了已经被回收了堆内存对象导致的,参考: http://code.tutsplus.com/tutor ...

  6. idea maven web工程明明添加了maven lib的依赖,但启动web容器时始终报No Class Found?

    idea maven web工程明明添加了maven lib的依赖,但启动web容器时始终报No Class Found? 很久没用idea搭新工程,最近自己想做个东西,冲心搭个web工程,jar包都 ...

  7. Python文件之----XML

    #coding=utf-8 from xml.dom import minidom from xml.dom.minidom import Document import xml def writeX ...

  8. Get URL parameters & values with jQuery

    原文: http://jquery-howto.blogspot.jp/2009/09/get-url-parameters-values-with-jquery.html In this post, ...

  9. iPhone 6 图像渲染揭秘(转)

    几天前,Apple发布了iPhone 6 Plus. 新的iPhone大幅改变了图像在屏幕上渲染的方式.我们做了一个图表进行详细分析. 分析. 转自:转送

  10. locate 不能使用

    当需要查找一个文件,只知道文件名不知道路径,我们通常用locate,由于公司的服务器使用最小化安装的所以当locate 文件名,报错,提 示-bash: locate: command not fou ...