hbase实践之协处理器Coprocessor
HBase客户端查询存在的问题
- Scan
用Get/Scan查询数据, - Filter
用Filter查询特定数据
以上情况只适合几千行数据以及不是很多的列的“小数据”。
当表扩展为亿万行及百万列时,在通过网络传递移动大量的数据导致网络拥堵,且客户端需要足够多内存来处理这么大量数据的计算操作,另外,客户端代码也会变的大而复杂。
解决方案
移动计算比移动数据更划算
Coprocessor将运算移动到数据所处的节点。
什么是Coprocessor?
简单来说,Coprocessor是一个框架,这个框架可以让你很容易地在Region Server运行你的业务逻辑代码。
Coprocessor类比
- Triggers and Stored Procedure
- Observer Coprocessor –> RDBMS 中的触发器
- EndPoint Coprocessor –> RDBMS中的存储过程
- MapReduce
MapReduce 和 Coprocessor有一样的操作原则,计算向数据靠拢。
- AOP
类似面向切面编程,Coprocessor就像应用Advice,在传递请求到最终的目的地之前,通过拦截一个请求后运行相同的代码。
Coprocessor分类
Observer Coprocessor
在一个特定的事件发生前或发生后触发。
- 在事件发生前触发的Coprocessor需要重写以pre作为前缀的方法,比如prePut。
- 在事件发生后触发的Coprocessor使用方法以post作为前缀,比如postPut。
Endpoint
是一个远程rpc调用,类似于webservice形式调用,但他不适用xml,而是使用的序列化框架是protobuf(序列化后数据更小).
区别:Observer像是个触发器,到某个条件Region就去执行用户代码,用户从主观来说是无法控制的;EndPoint就是远程调用,用户可以在客户端远程调用执行自己的代码。
Observer Coprocessor使用场景与实现
Observer Coprocessor的使用场景如下:
安全性:在执行Get或Put操作前,通过preGet或prePut方法检查是否允许该操作;
引用完整性约束:HBase并不直接支持关系型数据库中的引用完整性约束概念,即通常所说的外键。但是我们可以使用Coprocessor增强这种约束。比如根据业务需要,我们每次写入user表的同时也要向user_daily_attendance表中插入一条相应的记录,此时我们可以实现一个Coprocessor,在prePut方法中添加相应的代码实现这种业务需求。
二级索引:可以使用Coprocessor来维持一个二级索引。这里暂不展开,有时间会单独说明。
Observer在Hbase中主要分为四类,均继承Coprocessor接口:
- RegionObserver 针对于Region的观察者(Region打开、关闭、刷新、合并等工作)
- RegionServerObserver 针对RegionServer的观察者(Region合并、分裂、日志回滚等)
- MasterObserver 针对Master的观察者(表创建、删除、Region移动、拆分等工作)
- WALObserver 针对WAL的观察者(日志写)
EndPoint使用场景与实现
Endpoint允许定义自己的动态RPC协议,用于客户端与region servers通讯。Coprocessor 与region server在相同的进程空间中,因此您可以在region端定义自己的方法(endpoint),将计算放到region端,减少网络开销,常用于提升hbase的功能,如:count,sum等。
工作过程如下图所示过程:

- 不管是通过配置还是表描述加载了EndPoint协处理器
- 在Client执行CoprocessorExec()调用对应的RPC方法
- 在对应的每个region中都会执行该方法后返回结果
- EndPoint实现
- 创建一个“.proto”文件定义服务
- 执行protoc命令,通过“.proto”文件生成Java代码
- 编写一个Coprocessor类,实现Coprocessor和CoprocessorService两个接口,并实现接口中定义的方法:
- 加载Coprocessor
- 编写客户端代码调用Coprocessor
装载Coprocessor
装载Coprocessor分为静态装载和动态装载。
静态装载Coprocessor
- 静态装载过程:
- hbase-site.xml中创建记录
- 将代码放到HBase的类路径下。一个简单的方法是将封装好的jar(包括代码和依赖)放到HBase安装路径下的/lib目录中。
- 重启HBase。
- 静态卸载的步骤如下:
- 移除在hbase-site.xml中的配置。
- 重启HBase。
- 这一步是可选的,将上传到HBase类路径下的jar包移除。
动态装载Coprocessor
动态装载Coprocessor的一个优势就是不需要重启HBase。不过动态装载的Coprocessor只是针对某个表有效。因此,动态装载的Coprocessor又被称为表级Coprocessor。
此外,动态装载Coprocessor是对表的一次schema级别的调整,因此在动态装载Coprocessor时,目标表需要离线。
动态装载Coprocessor有两种方式:通过HBase Shell和通过Java API。
- 通过HBase Shell动态装载
- 使用Java API动态装载和卸载
http://www.zhyea.com/2017/04/13/using-hbase-coprocessor.html#Observer-Coprocessors
达摩克利斯之剑
Coprocessor是HBase的高级功能,本来是只为HBase系统开发人员准备的。因为Coprocessor的代码直接在RegionServer上运行,并直接接触数据,这样就带来了数据破坏的风险,比如“中间人攻击(Man-in-the-MiddleAttack,简称“MITM攻击”,见百度词条)”以及其他类型的恶意入侵。目前还没有任何机制来屏蔽Coprocessor导致的数据破坏。此外,因为没有资源隔离,一个即使不是恶意设计的但表现不佳的Coprocessor也会严重影响集群的性能和稳定性。
其他公司实践
二级索引设计
Phoenix的Salting功能非常有效,但对延迟影响较大,因此若延迟要求较高,那么Salting则并不合适,所以这里在主表与索引表中不使用Salting功能,而是采用reverse将主键列散列。索引中使用Function Index和Function Index减少查询延迟。
参考文献
- Hbase Coprocesor 浅析(一)
- 使用HBase Coprocessor
- Apache HBase Coprocessors
- 使用HBase协处理器---基本概念和regionObserver的简单实现
- HBase 协处理器之 EndPoint 简单示例
- https://zhuanlan.zhihu.com/p/38030330
- 移动计算比移动数据更划算 - 大数据技术源起
- Hbase使用Coprocessor构建二级索引
- 使用solr构建hbase二级索引
- Solr+Hbase多条件查(优劣互补)
hbase实践之协处理器Coprocessor的更多相关文章
- Hadoop生态圈-Hbase的协处理器(coprocessor)应用
Hadoop生态圈-Hbase的协处理器(coprocessor)应用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- HBase 二级索引与Coprocessor协处理器
Coprocessor简介 (1)实现目的 HBase无法轻易建立“二级索引”: 执行求和.计数.排序等操作比较困难,必须通过MapReduce/Spark实现,对于简单的统计或聚合计算时,可能会因为 ...
- Hadoop生态圈-注册并加载协处理器(coprocessor)的三种方式
Hadoop生态圈-注册并加载协处理器(coprocessor)的三种方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 到目前为止,大家已经掌握了如何使用过滤器来减少服务器端通过 ...
- hbase(三)coprocessor
介绍 coprocessor这个单词看起来很神秘,直译为协处理器,其实可以理解成依赖于regionserver进程的辅助处理接口. hbae在0.92版本之后提供了coprocessor接口.目前hb ...
- Sqoop导入HBase,并借助Coprocessor协处理器同步索引到ES
1.环境 Mysql 5.6 Sqoop 1.4.6 Hadoop 2.5.2 HBase 0.98 Elasticsearch 2.3.5 2.安装(略过) 3.HBase Coprocessor实 ...
- HBase实践案例:车联网监控系统
项目背景 本项目为车联网监控系统,系统由车载硬件设备.云服务端构成.车载硬件设备会定时采集车辆的各种状态信息,并通过移动网络上传到服务器端.服务器端接收到硬件设备发送的数据首先需要将数据进行解析,校验 ...
- hbase实践之Rowkey设计之道
笔者从一开始接触hbase就在思考rowkey设计,希望rowkey设计得好,能够支持查询的需求.使用hbase一段时间后,再去总结一些hbase的设计方法,无外乎以下几种: reverse salt ...
- hbase实践之rowkey设计
rowkey设计的重要性 rowkeys是HBase表设计中唯一重要的一点. rowkey设计要求 唯一性 存储特性 按照字典顺序排序存储 查询特性 由于其存储特性导致查询特性: 查询单个记录: 查定 ...
- HBase实践案例:知乎 AI 用户模型服务性能优化实践
用户模型简介 知乎 AI 用户模型服务于知乎两亿多用户,主要为首页.推荐.广告.知识服务.想法.关注页等业务场景提供数据和服务, 例如首页个性化 Feed 的召回和排序.相关回答等用到的用户长期兴趣特 ...
随机推荐
- OpenDrive格式地图
https://blog.csdn.net/lewif/article/details/78575840 UE 编辑spline: https://docs.unrealengine.com/en-U ...
- Apache Kafka教程
1.卡夫卡教程 今天,我们正在使用Apache Kafka Tutorial开始我们的新旅程.在这个Kafka教程中,我们将看到什么是Kafka,Apache Kafka历史以及Kafka的原因.此外 ...
- 向php数组函数array_colum()传入奇怪的数组
<?php // 向php数组函数array_colum()传入奇怪的数组 // array_colum()函数 返回行列数组的其中一列,可以用其他列的键充当键 $arr = [ [ 1, 2, ...
- pycharm爬取网页数据
1 python环境的配置 1.1 安装python文件包,放到可以找到的位置 1.2 右键计算机->属性->高级环境设置->系统变量->Path->编辑->复制p ...
- AQS(AbstractQueuedSynchronizer)
AbstractQueuedSynchronizer 是一个锁框架.实现的原理(大概): 1.关于重入锁方面的实现,参考(手写一个可重入锁). 2.关于公平锁方面的实现,使用双链表的形式,进行公平锁的 ...
- Codeforces Round #570 Div. 3
A:暴力从小到大枚举判断. #include<bits/stdc++.h> using namespace std; #define ll long long #define inf 10 ...
- 8 search中的timeout参数
默认的search,是没有时间限制的.比如,一个search,可能要10分钟才能搜完,那么,es就会等10分钟,直到结果出来. 然而,在某些场景下,客户是等不了10分钟的.比如,电商网站,客户宁可 ...
- 浅谈对BFC的认识,以及用bfc解决浮动问题
我们在前端的学习过程中常常会遇到BFC,用BFC来解决一些margin塌陷.margin合并清理浮动流的问题 那么问题来了,我们所说的BFC到底是个什么东西呢: 什么是BFC BFC(Block Fo ...
- JavaScript,数组,方法;
JavaScript,数组除了常见的增删查改,其他的方法也有很多. let arr = [1, 3, 7, 6, 9, 4, 6, 2]; 1:every方法, 对数组进行遍历,每个元素都满足条件时, ...
- vue中v-if和v-for指令最好不要同时使用
建议不要在与v-for相同的元素上使用v-if.因为v-for指令的优先级高于v-if当它们处于同一节点.v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for ...