Hbase总结(八)Hbase中的Coprocessor
1.起因(Why HBase Coprocessor)
HBase作为列族数据库最常常被人诟病的特性包含:无法轻易建立“二级索引”,难以运行求和、计数、排序等操作。比方,在旧版本号的(<0.92)Hbase中, q=%E7%BB%9F%E8%AE%A1%E6%95%B0%E6%8D%AE%E8%A1%A8&ie=utf-8&src=se_lighten_f" style="margin:0px;padding:0px;text-decoration:none;color:rgb(0,0,240);border-bottom-width:1px;border-bottom-style:dotted;border-bottom-color:rgb(51,51,51);display:inline;">统计数据表 q=%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E5%B1%82&ie=utf-8&src=se_lighten_f" style="margin:0px;padding:0px;text-decoration:none;color:rgb(0,0,240);border-bottom-width:1px;border-bottom-style:dotted;border-bottom-color:rgb(51,51,51);display:inline;">数据存储层
Job才干得到。尽管HBase在
2.灵感来源( Source of Inspration)
HBase协处理器的灵感来自于Jeff Dean 09年的演讲(
P66-67)。
它依据该演讲实现了相似于bigtable的协处理器,包含以下特性:
HBase建立了一个框架。它为用户提供类库和运行时环境。使得他们的代码能够在HBase region server和master上处理。
3.细节剖析(Implementation)
协处理器分两种类型,系统协处理器能够全局导入region server上的全部数据表,表协处理器即是用户能够指定一张表使用协处理器。协处理器框架为了更好支持其行为的灵活性。提供了两个不同方面的插件。
一个是观察者(observer)。相似于关系数据库的触发器。
还有一个是终端(endpoint),动态的终端有点像存储过程。
3.1观察者(Observer)
观察者的设计意图是同意用户通过插入代码来重载协处理器框架的upcall方法。而详细的事件触发的callback方法由HBase的核心代码来运行。
协处理器框架处理全部的callback调用细节。协处理器自身仅仅须要插入加入或者改变的功能。
以HBase0.92版本号为例,它提供了三种观察者接口:
- RegionObserver:提供client的数据操纵事件钩子:Get、Put、Delete、Scan等。
- WALObserver:提供WAL相关操作钩子。
- MasterObserver:提供DDL-类型的操作钩子。如创建、删除、修改数据表等。
这些接口能够同一时候使用在同一个地方,依照不同优先级顺序运行.用户能够随意基于协处理器实现复杂的HBase功能层。HBase有非常多种事件能够触发观察者方法,这些事件与方法从HBase0.92版本号起。都会集成在HBase API中。
只是这些API可能会由于各种原因有所修改。不同版本号的接口修改比較大,详细參考Java
Doc。
RegionObserver工作原理,如图1所看到的。
很多其它关于Observer细节请參见HBaseBook的第9.6.3章节。
图1 RegionObserver工作原理
3.2终端(Endpoint)
终端是动态RPC插件的接口。它的实现代码被安装在服务器端。从而能够通过HBase RPC唤醒。client类库提供了非常方便的方法来调用这些动态接口。它们能够在随意时候调用一个终端。它们的实现代码会被目标region远程运行。结果会返回到终端。用户能够结合使用这些强大的插件接口,为HBase加入全新的特性。终端的使用,如以下流程所看到的:
- 定义一个新的protocol接口,必须继承CoprocessorProtocol.
- 实现终端接口,该实现会被导入region环境运行。
- 继承抽象类BaseEndpointCoprocessor.
- 在client。终端能够被两个新的HBase Client API调用 。
单个region:HTableInterface.coprocessorProxy(Class<T> protocol, byte[] row) 。rigons区域:HTableInterface.coprocessorExec(Class<T> protocol, byte[] startKey, byte[] endKey, Batch.Call<T,R>
callable)
总体的终端调用过程范例,如图2所看到的:
图2 终端调用过程范例
4.编程实践(Code Example)
在该实例中,我们通过计算HBase表中行数的一个实例,来真实感受协处理器 的方便和强大。在旧版的HBase我们须要编写MapReduce代码来汇总数据表中的行数,在0.92以上的版本号HBase中,仅仅须要编写client的代码就可以实现,非常适合用在WebService的封装上。
4.1启用协处理器 Aggregation(Enable Coprocessor Aggregation)
我们有两个方法:1.启动全局aggregation。能过操纵全部的表上的数据。通过修改hbase-site.xml这个文件来实现,仅仅须要加入例如以下代码:
<property>
<name>hbase.coprocessor.user.region.classes</name>
<value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value>
</property>
2.启用表aggregation,仅仅对特定的表生效。通过HBase Shell 来实现。
(1)disable指定表。hbase> disable 'mytable'
(2)加入aggregation hbase> alter 'mytable', METHOD => 'table_att','coprocessor'=>'|org.apache.hadoop.hbase.coprocessor.AggregateImplementation||'
(3)重新启动指定表 hbase> enable 'mytable'
4.2统计行数代码(Code Snippet)
public class MyAggregationClient {
private static final byte[] TABLE_NAME = Bytes.toBytes("mytable");
private static final byte[] CF = Bytes.toBytes("vent");
public static void main(String[] args) throws Throwable {
Configuration customConf = new Configuration();
customConf.setStrings("hbase.zookeeper.quorum",
"node0,node1,node2");
//提高RPC通信时长
customConf.setLong("hbase.rpc.timeout", 600000);
//设置Scan缓存
customConf.setLong("hbase.client.scanner.caching", 1000);
Configuration configuration = HBaseConfiguration.create(customConf);
AggregationClient aggregationClient = new AggregationClient(
configuration);
Scan scan = new Scan();
//指定扫描列族,唯一值
scan.addFamily(CF);
long rowCount = aggregationClient.rowCount(TABLE_NAME, null, scan);
System.out.println("row count is " + rowCount);
}
}
4.3 典型样例
协处理器当中的一个作用是使用Observer创建二级索引。先举个实际样例:
我们要查询指定店铺指定客户购买的订单,首先有一张订单详情表,它以被处理后的订单id作为rowkey。其次有一张以客户nick为rowkey的索引表,结构例如以下:
rowkey family
dp_id+buy_nick1 tid1:null tid2:null ...
dp_id+buy_nick2 tid3:null
...
该表能够通过Coprocessor来构建。实例代码:
public class TestCoprocessor extends BaseRegionObserver {
@Override
public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e,
final Put put, final WALEdit edit, final boolean writeToWAL)
throws IOException {
Configuration conf = new Configuration();
HTable table = new HTable(conf, "index_table");
List<KeyValue> kv = put.get("data".getBytes(), "name".getBytes());
Iterator<KeyValue> kvItor = kv.iterator();
while (kvItor.hasNext()) {
KeyValue tmp = kvItor.next();
Put indexPut = new Put(tmp.getValue());
indexPut.add("index".getBytes(), tmp.getRow(), Bytes.toBytes(System.currentTimeMillis()));
table.put(indexPut);
}
table.close();
}
}
即继承BaseRegionObserver类,实现prePut方法,在插入订单详情表之前,向索引表插入索引数据。
4.4索引表的使用
先在索引表get索引表,获取tids,然后依据tids查询订单详情表。
当有多个查询条件(多张索引表),依据逻辑运算符(and 、or)确定tids。
4.5使用时注意
1.索引表是一张普通的hbase表,为安全考虑须要开启Hlog记录日志。
2.索引表的rowkey最好是不可变量,避免索引表中产生大量的脏数据。
3.如上样例,column是横向扩展的(宽表)。rowkey设计除了要考虑region均衡,也要考虑column数量。即表不要太宽。建议不超过3位数。
4.如上代码,一个put操作事实上是先后向两张表put数据,为保证一致性,须要考虑异常处理,建议异常时重试。
4.6效率情况
put操作效率不高,如上代码。每插入一条数据须要创建一个新的索引表连接(能够使用htablepool优化)。向索引表插入数据。即耗时是双倍的。对hbase的集群的压力也是双倍的。
当索引表有多个时。压力会更大。
查询效率比filter高,毫秒级别,由于都是rowkey的查询。
如上是预计的效率情况,须要依据实际业务场景和集群情况而定。最好做预先測试。
4.7Coprocessor二级索引方案优劣
长处:在put压力不大、索引region均衡的情况下,查询非常快。
缺点:业务性比較强,若有多个字段的查询,须要建立多张索引表,须要保证多张表的数据一致性,且在hbase的存储和内存上都会有更高的要求。
Hbase总结(八)Hbase中的Coprocessor的更多相关文章
- HBase(八)HBase的协处理器
一.协处理器简介 1. 起源 Hbase 作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执 行求和.计数.排序等操作.比如,在旧版本的(<0.92)Hbase 中,统计数 ...
- HBase 实战(1)--HBase的数据导入方式
前言: 作为Hadoop生态系统中重要的一员, HBase作为分布式列式存储, 在线实时处理的特性, 备受瞩目, 将来能在很多应用场景, 取代传统关系型数据库的江湖地位. 本篇博文重点讲解HBase的 ...
- HBase 2、HBase安装与初试牛刀
官方帮助文档:http://hbase.apache.org/book.html PDF:http://hbase.apache.org/apache_hbase_reference_guide.p ...
- HBase篇--搭建HBase完全分布式集群
一.前述. 完全分布式基于hadoop集群和Zookeeper集群.所以在搭建之前保证hadoop集群和Zookeeper集群可用.可参考本人博客地址 https://www.cnblogs.com/ ...
- Hbase框架原理及相关的知识点理解、Hbase访问MapReduce、Hbase访问Java API、Hbase shell及Hbase性能优化总结
转自:http://blog.csdn.net/zhongwen7710/article/details/39577431 本blog的内容包含: 第一部分:Hbase框架原理理解 第二部分:Hbas ...
- Hbase 学习(一) hbase配置文件同步
最近在狂啃hadoop的书籍,这部<hbase:权威指南>就进入我的视野里面了,啃吧,因为是英文的书籍,有些个人理解不对的地方,欢迎各位拍砖. HDFS和Hbase配置同步 hbase的配 ...
- [转]HBase hbck——检察HBase集群的一致性
Hbase提供了hbck命令来检查各种不一致问题.hbck的名字仿效了HDFS的fsck命令,后者是一个用于检查HDFS中不一致问题的工具.下面这段非常易懂的介绍出自于hbck的源程序. 检查数据在M ...
- 大数据技术之_11_HBase学习_01_HBase 简介+HBase 安装+HBase Shell 操作+HBase 数据结构+HBase 原理
第1章 HBase 简介1.1 什么是 HBase1.2 HBase 特点1.3 HBase 架构1.3 HBase 中的角色1.3.1 HMaster1.3.2 RegionServer1.3.3 ...
- HBase伪分布式安装(HDFS)+ZooKeeper安装+HBase数据操作+HBase架构体系
HBase1.2.2伪分布式安装(HDFS)+ZooKeeper-3.4.8安装配置+HBase表和数据操作+HBase的架构体系+单例安装,记录了在Ubuntu下对HBase1.2.2的实践操作,H ...
- 通过HBase Shell与HBase交互
出处:http://www.taobaotest.com/blogs/1604 业务开发测试HBase之旅二:通过HBase Shell与HBase交互 yedu 发表于:2011-10-11 浏览: ...
随机推荐
- [BZOJ5306][HAOI2018]染色
bzoj luogu Description 给一个长度为\(n\)的序列染色,每个位置上可以染\(m\)种颜色.如果染色后出现了\(S\)次的颜色有\(k\)种,那么这次染色就可以获得\(w_k\) ...
- [POJ1625]Censored!(AC自动机+DP+高精度)
Censored! Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 10824 Accepted: 2966 Descri ...
- CodeForces - 1016C Vasya And The Mushrooms
题面在这里! 好久没有体会这种A题的快感了23333 一开始看错了,以为权值是从1开始的,不过这样不要紧,最后把算的答案减去两行数的和就是正确的答案了. 然后发现位于一个角上的时候,我们其实只有两种选 ...
- 【期望DP】BZOJ2318-[Spoj4060]Game with probability Problem
[题目大意] Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币 ...
- 20162325 金立清 S2 W6 C15
20162325 2017-2018-2 <程序设计与数据结构>第6周学习总结 教材学习内容概要 队列是先进先出(FIFO)的集合 队列是保存重复编码k值的一种有效结构 实现模拟时常用队列 ...
- java高并发程序设计模式-并发级别:阻塞、无障碍、无锁、无等待【转载】
一般认为并发可以分为阻塞与非阻塞,对于非阻塞可以进一步细分为无障碍.无锁.无等待,下面就对这几个并发级别,作一些简单的介绍. 1.阻塞 阻塞是指一个线程进入临界区后,其它线程就必须在临界区外等待,待进 ...
- 01-项目简介Springboot简介入门配置项目准备
总体课程主要分为4个阶段课程: ------------------------课程介绍------------------------ 01-项目简介Springboot简介入门配置项目准备02-M ...
- UESTC 2015dp专题 N 导弹拦截 dp
导弹拦截 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/65 Descrip ...
- OC 导入类 #import和@class 区别复习
objective-c中#import和@class的区别 在Objective-C中,可以使用#import和@class来引用别的类型, 但是你知道两者有什么区别吗? @class叫做forwar ...
- poj 3131 双向搜索+hash判重
题意: 初始状态固定(朝上的全是W,空格位置输入给出),输入初始状态的空格位置,和最终状态朝上的位置,输出要多少步才能移动到,超过30步输出-1. 简析: 每一个格子有6种状态,分别是 0WRB, 1 ...