转自 http://walkoven.com/?p=77

hbase coprocessor的分析

下载链接:hbase coprocessor的分析.pdf

hbase Coprocessor是很多人对hbase-0.92的重大期待之一。它让离线分析和在线应用很好地结合在了一起,另外也极大地拓展了hbase的应用 丰富性,不再是简单的k-v类应用。hbase coprocessor的设计来源于hbase-2000和hbase-2001两个issue。那么几年过去了,hbase coprocessor究竟发展到什么程度,可以将它们用于哪些地方呢?下文主要内容来源于Trend Micro Hadoop Group的成员,同时也是hbase coprocessor的作者,不愿意看底下啰嗦废话的同学可以直接跳到最后面的总结看。

原文链接:https://blogs.apache.org/hbase/entry/coprocessor_introduction。

hbase coprocessor随着0.92的release而完整地release出来了,它的设计来源于google bigtable的coprocessor(Jeff Dean的一篇演讲)。coprocessor其实是一个类似mapreduce的分析组件,不过它极大简化了mapreduce模型,只是将请求独立地 在各个region中并行地运行,并且提供了一套框架能够让用户非常灵活地编写自定义的coprocessor。hbase的coprocessor与 google的coprocessor最大的区别是,hbase的coprocessor是一套在regionserver和master进程内的框架, 可以在运行期动态执行用户的代码,而google的coprocessor则是拥有自己独立的进程和地址空间。看起来似乎hbase的 coprocessor更加高效,但其实并非如此,拥有独立的地址空间的好处是可以通过与计算资源的绑定更高效地使用硬件,比如通过cgroup的方式绑 定到独立的cpu上去工作。
现在hbase的coprocessor有两种完全不同的实现,分别是observer模式与endpoint模式,它们分别对应2000和2001两个issue。我们可以将observer模式看成数据库中的触发器,而endpoint可以看成是存储过程。
关于coprocessor我们可以从类继承关系上看到,如下图所示:
共有三个Observer对象,即MasterObserver,RegionObserver和WALObserver。它们的工作原理类似于钩子函 数,在真实的函数实现前加入pre(),实现后加入post()方法,来实现对操作进行一些嵌入式的改变。效率上的影响仅仅取决于嵌入的钩子函数本身的影 响。如下图所示:
比如下面这段代码就实现了在get之前做权限检查:
publicclassAccessControlCoprocessorextends BaseRegionObserver {
@Override
public void preGet(final ObserverContext c,
final Get get, final List result) throws IOException
throws IOException {

// check permissions..
if (!permissionGranted()) {
thrownewAccessDeniedException("User is not allowed to access.");
}
}

// override prePut(), preDelete(), etc.
}

在hbase的社区中,己经有很多人提出了各种基于Observer的实现方法,来做一些有意义的事。比如可以通过regionObserver实现刚才 说的权限,还有故障隔离,优先级等工作。通过MasterObserver则可以实现对ddl操作的监控。通过WALObserver则可以实现二级索 引、replication等工作。不过遗憾的是,很少有想法实现了,主要原因还是大家都比较忙,而相应的需求在现阶段还不强烈,所以留待后面来做。由于 Observer框架的灵活性和扩展性,用户可以方便地自定义各种符合自己需求的实现。
BaseEndpoint类则是直接实现了Coprocessor接口,它实际上是client-side的实现,即客户端包装了一个HTable的实 现,将类似于getMin()的操作包装起来,内部则通过并行scan等操作来实现。这就很类似一个简单的mapreduce,map就是在目标 region server上的那些region,而reduce则是客户端。这个方法对于习惯于编写map reduce代码的人来说非常直观,可以很容易地实现sum,min等接口。由于这一层包装,可以屏蔽掉很多开发上的细节,让开发应用的人专注于开发应 用,将底层实现交给mapreduce programmer。
一个简单的Endpoint例子如下:

public T getMin(ColumnInterpreter ci, Scan scan)
throws IOException {
T min = null;
T temp;
InternalScanner scanner = ((RegionCoprocessorEnvironment) getEnvironment())
.getRegion().getScanner(scan);
List results = new ArrayList();
byte[] colFamily = scan.getFamilies()[0];
byte[] qualifier = scan.getFamilyMap().get(colFamily).pollFirst();
try {
boolean hasMoreRows = false;
do {
hasMoreRows = scanner.next(results);
for (KeyValue kv : results) {
temp = ci.getValue(colFamily, qualifier, kv);
min = (min == null || ci.compare(temp, min) < 0) ? temp : min;
}
results.clear();
} while (hasMoreRows);
} finally {
scanner.close();
}
log.info("Minimum from this region is "
+ ((RegionCoprocessorEnvironment) getEnvironment()).getRegion()
.getRegionNameAsString() + ": " + min);
return min;
}
Coprocessor可以让用户随时加载自己实现的代码,而不需要重启系统。它可以通过配置来加载,也可以通过shell或java程序来加载。
总结:
  • hbase coprocessor是脱胎于google bigtable coprocessor,区别是hbase coprocessor并非独立进程,而是在原来进程中嵌入框架
  • hbase coprocessor的实现分为observer与endpoint,其中observer类似于触发器,主要在服务端工作,而endpoint类似于存储过程,主要在client端工作
  • observer可以实现权限管理、优先级设置、监控、ddl控制、二级索引等功能,而endpoint可以实现min、mas、avg、sum等功能
  • coprocessor可以动态加载
  • coprocessor的性能取决于想要加载的方法的性能,不过为了有一个直观的了解,我们仍然近期打算对hbase coprocessor的一些典型场景做性能测试。

转载于:https://www.cnblogs.com/linhaohong/archive/2012/05/16/2503988.html

hbase coprocessor的分析相关推荐

  1. HBase源码分析之HRegion上compact流程分析(三)

    在<HBase源码分析之HRegion上compact流程分析(二)>一文中,我们没有讲解真正执行合并的CompactionContext的compact()方法.现在我们来分析下它的具体 ...

  2. 技术篇-HBase Coprocessor 的实现与应用

    本次分享的内容主要分为以下五点: Coprocessor 简介 Endpoint 服务端实现 Endpoint 客户端实现 Observer 实现二级索引 Coprocessor 应用场景 1. Co ...

  3. Hbase Coprocessor(协处理器)的使用

    本博客记录初次使用hbase coprocessor的过程.协处理器分两种类型,系统协处理器可以全局导入region server上的所有数据表,表协处理器即是用户可以指定一张表使用协处理器.协处理器 ...

  4. Hbase源码分析:Hbase UI中Requests Per Second的具体含义

    Hbase源码分析:Hbase UI中Requests Per Second的具体含义 让运维加监控,被问到Requests Per Second(见下图)的具体含义是什么?我一时竟回答不上来,虽然大 ...

  5. 使用HBase Coprocessor协处理器

    原文: http://www.zhyea.com/2017/04/13/using-hbase-coprocessor.html HBase的Coprocessor是模仿谷歌BigTable的Copr ...

  6. 使用HBase Coprocessor

    转载自:使用HBase Coprocessor HBase的Coprocessor是模仿谷歌BigTable的Coprocessor模型实现的. Coprocessor提供了一种机制可以让开发者直接在 ...

  7. Hbase Coprocessor 协处理器 与 JavaAPI

    协处理器概念 一.协处理器有两种: observer 和 endpoint 1.observer协处理器 Observer 类似于传统数据库中的触发器,当发生某些事件的时候这类协处理器会被 Serve ...

  8. HBase文件索引分析

    2019独角兽企业重金招聘Python工程师标准>>> 基于HBase 0.94.3分析 HBase总体结构图   部分术语简介 HMaster 负责管理HRegionServer的 ...

  9. Spark Stream整合flum和kafka,数据存储在HBASE上,分析后存入数据库

    开发环境:Hadoop+HBASE+Phoenix+flum+kafka+spark+MySQL 默认配置好了Hadoop的开发环境,并且已经安装好HBASE等组件. 下面通过一个简单的案例进行整合: ...

最新文章

  1. 回文数:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
  2. CEPH集群更换ip(更换ip前的防范和更换ip后的恢复)
  3. 对 android apk 进行重新签名操作
  4. 使用RDLC报表(二)--使用自定义数据集
  5. Android 反射获取内外置存储卡方法
  6. 阿里大鱼短信介入demo分享
  7. 二叉树前序、中序、后序遍历非递归写法的透彻解析
  8. redis安装190923课堂版
  9. 利用mysql的预编译机制_Mysqli的预编译机制处理批量数据过程
  10. python数据分析:Numpy
  11. 对比起来学习前端三大框架(持续更新)
  12. php字符串指定长度截取,php 截取指定长度字符串的代码分享
  13. oracle 12c 自增序列
  14. 《WebRTC源码深入剖析》总结
  15. 怎么实现红鲤鱼与绿鲤鱼与驴代码
  16. 怎么画动漫人物的五官:耳鼻眼嘴
  17. Linux中的0.0.0.0和 ::
  18. hdf5 目录没有serial_hdf5
  19. c语言如何用fscanf将字符串读取,fscanf如何使用C语言处理%c和%s
  20. CSS-sprit 雪碧图

热门文章

  1. 【Java Web前端开发】JavaScript基础
  2. python【力扣LeetCode算法题库】70-爬楼梯
  3. 原生js实现对象的深拷贝及循环引用
  4. 免费网络推广浅析对网站首页优化的注意细节把控!
  5. 知乎赴美上市为缓解商业化瓶颈,下一步网络推广知乎想怎么做?
  6. 新网站优化基本流程不可忽视!
  7. 新站优化工作还有一点点补充内容!
  8. bootstrap4导航栏点击弹出表单_Bootstrap4从入门到精通
  9. 计算阶比分析 matlab_(案例)层次聚类分析Matlab编码计算
  10. python条形图数据标签_python – Plotly中用于条形图的单独标记条形图