以上状况只适合几千行数据以及不是不少的列的“小数据”。html
当表扩展为亿万行及百万列时,在经过网络传递移动大量的数据致使网络拥堵,且客户端须要足够多内存来处理这么大量数据的计算操做,另外,客户端代码也会变的大而复杂。ios
移动计算比移动数据更划算git
Coprocessor将运算移动到数据所处的节点。github
简单来讲,Coprocessor是一个框架,这个框架可让你很容易地在Region Server运行你的业务逻辑代码。web
MapReduce 和 Coprocessor有同样的操做原则,计算向数据靠拢。数据库
相似面向切面编程,Coprocessor就像应用Advice,在传递请求到最终的目的地以前,经过拦截一个请求后运行相同的代码。apache
在一个特定的事件发生前或发生后触发。编程
是一个远程rpc调用,相似于webservice形式调用,但他不适用xml,而是使用的序列化框架是protobuf(序列化后数据更小).安全
区别:Observer像是个触发器,到某个条件Region就去执行用户代码,用户从主观来讲是没法控制的;EndPoint就是远程调用,用户能够在客户端远程调用执行本身的代码。网络
Observer Coprocessor的使用场景以下:
安全性:在执行Get或Put操做前,经过preGet或prePut方法检查是否容许该操做;
引用完整性约束:HBase并不直接支持关系型数据库中的引用完整性约束概念,即一般所说的外键。可是咱们可使用Coprocessor加强这种约束。好比根据业务须要,咱们每次写入user表的同时也要向user_daily_attendance表中插入一条相应的记录,此时咱们能够实现一个Coprocessor,在prePut方法中添加相应的代码实现这种业务需求。
二级索引:可使用Coprocessor来维持一个二级索引。这里暂不展开,有时间会单独说明。
Observer在Hbase中主要分为四类,均继承Coprocessor接口:
Endpoint容许定义本身的动态RPC协议,用于客户端与region servers通信。Coprocessor 与region server在相同的进程空间中,所以您能够在region端定义本身的方法(endpoint),将计算放到region端,减小网络开销,经常使用于提高hbase的功能,如:count,sum等。
工做过程以下图所示过程:
装载Coprocessor分为静态装载和动态装载。
动态装载Coprocessor的一个优点就是不须要重启HBase。不过动态装载的Coprocessor只是针对某个表有效。所以,动态装载的Coprocessor又被称为表级Coprocessor。
此外,动态装载Coprocessor是对表的一次schema级别的调整,所以在动态装载Coprocessor时,目标表须要离线。
动态装载Coprocessor有两种方式:经过HBase Shell和经过Java API。
Coprocessor是HBase的高级功能,原本是只为HBase系统开发人员准备的。由于Coprocessor的代码直接在RegionServer上运行,并直接接触数据,这样就带来了数据破坏的风险,好比“中间人攻击(Man-in-the-MiddleAttack,简称“MITM攻击”,见百度词条)”以及其余类型的恶意入侵。目前尚未任何机制来屏蔽Coprocessor致使的数据破坏。此外,由于没有资源隔离,一个即便不是恶意设计的但表现不佳的Coprocessor也会严重影响集群的性能和稳定性。
Phoenix的Salting功能很是有效,但对延迟影响较大,所以若延迟要求较高,那么Salting则并不合适,因此这里在主表与索引表中不使用Salting功能,而是采用reverse将主键列散列。索引中使用Function Index和Function Index减小查询延迟。