`
zhangxiong0301
  • 浏览: 351180 次
社区版块
存档分类
最新评论

hbase observer

阅读更多

Hbase自0.92之后开始支持Coprocessor(协处理器),旨在使用户可以将自己的代码放在regionserver上来运行,即将计算程序移动到数据所在的位置进行运算。这一点与MapReduce的思想一致。Hbase的Coprocess分为observer和endpoint两大类。简单说,observer相当于关系型数据库中的触发器,而endpoint则相当于关系型数据库中的存储过程。关于HBase Coprocessor的介绍网上有很多的文档,由于我也是刚刚学习,从很多好人贡献的文档上了解了很多。

    这里记录一下自己在一个完全分布式系统上部署自定义的Coprocessor的过程,本文会介绍两种部署的方法:一种是在hbase-site.xml中配置;第二种是使用表描述符来配置(alter);前者会被所有的表的所有的region加载,而后者只会对指定的表的所有region加载。本文会结合自己的实验过程指出哪些地方为易错点。

    首先,还是先来看下环境:

        hadoop1.updb.com    192.168.0.101    Role:master

        hadoop2.updb.com    192.168.0.102    Role:regionserver

        hadoop3.updb.com    192.168.0.103    Role:regionserver

        hadoop4.updb.com    192.168.0.104    Role:regionserver

        hadoop5.updb.com    192.168.0.105    Role:regionserver

    首先编码自定义的Coprocessor,该段代码摘自《Hbase权威指南》,只是修改了package的名字:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
 * coprocessor
 * 当用户在使用get命令从表中取特定的row时,就会触发这个自定义的observer coprocessor
 * 触发条件是用户使用get指定的rowkey与程序中指定的FIXED_ROW一致为@@@GETTIME@@@时
 * 触发后的操作是程序会在服务端生成一个keyvalue实例,并将这个实例返回给客户端。这个kv实例是以
 * @@@GETTIME@@@为rowkey,列族和列标识符均为@@@GETTIME@@@,列值为服务器端的时间
 */
 
package org.apache.hbase.kora.coprocessor;
 
import java.io.IOException;
import java.util.List;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver;
import org.apache.hadoop.hbase.coprocessor.ObserverContext;
import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;
import org.apache.hadoop.hbase.regionserver.HRegion;
import org.apache.hadoop.hbase.util.Bytes;
 
public class RegionObserverExample extends BaseRegionObserver {
    public static final Log LOG = LogFactory.getLog(HRegion.class);
    public static final byte[] FIXED_ROW = Bytes.toBytes("@@@GETTIME@@@");
 
    @Override
    public void preGet(ObserverContext<RegionCoprocessorEnvironment> c,
            Get get, List<KeyValue> result) throws IOException {
        LOG.debug("Got preGet for row: " + Bytes.toStringBinary(get.getRow()));
         
        if (Bytes.equals(get.getRow(), FIXED_ROW)) {
            KeyValue kv = new KeyValue(get.getRow(), FIXED_ROW, FIXED_ROW,
                    Bytes.toBytes(System.currentTimeMillis()));
            LOG.debug("Had a match, adding fake kv: " + kv);
            result.add(kv);
        }
    }
}

    编码完成后需要将该类编译并打成jar包,类名上右击--Export,弹出如下窗口

    选择JAR file,然后Next,出现如下窗口

    指定jar文件的保存路径,然后finish,就完成了RegionObserverExample类的编译和打包,接下来就需要将打好的jar文件使用ftp的方式上传到hbase集群的master服务器上,这里为hadoop1。

1
2
3
4
5
6
7
8
9
## 已经上传到hadoop1上
[grid@hadoop1 ~]$ ls /var/ftp/pub/RegionObserverExample.jar 
/var/ftp/pub/RegionObserverExample.jar
## 由于是完全分布式系统,为了方便管理,我们将jar包存放到hadoop hdfs的根目录下的jars目录下
[grid@hadoop1 ~]$ hdfs dfs -put /var/ftp/pub/RegionObserverExample.jar /jars
## OK,验证已经上传成功
[grid@hadoop1 ~]$ hdfs dfs -ls /jars                                        
Found 1 items
-rw-r--r--   4 grid supergroup       3884 2014-11-15 04:46 /jars/RegionObserverExample.jar

    然后需要修改hbase的hbase-env.sh、hbase-site.xml两个配置文件

1
2
3
4
5
6
7
8
9
## 首先修改hbase-env.sh中的这行,将存放Coprocessor jar文件的目录添加到Hbase的classpath中
export HBASE_CLASSPATH=hdfs://hadoop1:8020/jars
 
## 然后修改hbase-site.xml文件,添加一个选项
    <!-- 这里要注意value中一定要写完整的类名(即把包名写全),否则报ClassNotFound错 -->
    <property>
        <name>hbase.coprocessor.region.classes</name>
        <value>org.apache.hbase.kora.coprocessor.RegionObserverExample</value>
    </property>

    在master上修改配置文件完成之后,将修改后的文件scp到其他个regionserver上,然后重启hbase使配置生效。重启之后来看是否能够正确的触发

1
2
3
4
5
6
7
8
9
10
## 使用get命令从kora表中取rowkey为@@@GETTIME@@@的行
hbase(main):014:0> get 'kora''@@@GETTIME@@@'
COLUMN                   CELL                                                                
 @@@GETTIME@@@:@@@GETTIM timestamp=9223372036854775807, value=\x00\x00\x01I\xB0@\xA0\xE0     
 E@@@                                                                                        
1 row(s) in 0.0420 seconds
## 将列值转化为uninx 时间
hbase(main):015:0> Time.at(Bytes.toLong("\x00\x00\x01I\xB0\x0BZ\x0B".to_java_bytes)/ 1000)
=> Sat Nov 15 04:42:54 +0800 2014    
## 从上面的测试中看出,我们自定义的Coprocessor已经成功的部署到分布式系统中了。

    需要留意的是在hbase-site.xml配置的Coprocessor默认是会被每张表的每个region加载。如果只想要某个表使用这个observer coprocessor,就需要使用表描述符的加载方式,这种方式同样的需要修改hbase-env.sh将jar包路径添加到hbase的classpath中去,与上面不同的是不用在hbase-site.xml中设置Coprocessor,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
## 看hbase-env.sh的配置
[grid@hadoop1 ~]$ grep "jars" /opt/hbase-0.98.4-hadoop2/conf/hbase-env.sh 
export HBASE_CLASSPATH=hdfs://hadoop1:8020/jars
 
## 注释掉hbase-site.xml中的Coprocessor的配置
[grid@hadoop1 ~]$ tail -7  /opt/hbase-0.98.4-hadoop2/conf/hbase-site.xml 
<!--
    <property>
        <name>hbase.coprocessor.region.classes</name>
        <value>org.apache.hbase.kora.coprocessor.RegionObserverExample</value>
    </property>
 -->
</configuration>

    在hbase shell中使用alter命令来为kora表来设定Coprocessor

1
2
3
4
5
6
7
8
9
10
11
## 格式:[coprocessor jar file location] | class name | [priority] | [arguments]
## 列子:hbase> alter 't1',
##       'coprocessor'=>'hdfs:///foo.jar|com.foo.FooRegionObserver|1001|arg1=1,arg2=2'
## 由于一定设置了classpath,所以可以忽略jar file location,如下:
hbase(main):101:0> alter 'kora',
hbase(main):102:0* 'coprocessor' => '|org.apache.hbase.kora.coprocessor.RegionObserverExample|'
Updating all regions with the new schema...
0/1 regions updated.
1/1 regions updated.
Done.
0 row(s) in 2.5670 seconds

    设置成功,decribe下表

1
2
3
4
5
6
7
hbase(main):103:0> describe 'kora'
DESCRIPTION                                                                                           ENABLED                                                
 'kora', {TABLE_ATTRIBUTES => {coprocessor$1 => '|org.apache.hbase.kora.coprocessor.RegionObserverExa true                                                   
 mple|'}, {NAME => 'project', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE                                                         
 => '0', VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_                                                        
 CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}                                                                         
1 row(s) in 0.0580 seconds

    ok,已经设置成功,下面来测试一下

1
2
3
4
5
6
7
8
9
## kora表,指定了Coprocessor
hbase(main):104:0> get 'kora''@@@GETTIME@@@'
COLUMN                                   CELL                                                                                                                
 @@@GETTIME@@@:@@@GETTIME@@@             timestamp=9223372036854775807, value=\x00\x00\x01I\xB0\x985W                                                        
1 row(s) in 0.0360 seconds
## testtable,没有指定Coprocessor
hbase(main):105:0> get 'testtable''@@@GETTIME@@@'
COLUMN                                   CELL                                                                                                                
0 row(s) in 0.0180 seconds

    需要注意的是,Coprocessor的优先级有SYSTEM和USER两种,SYSTEM优先于USER加载。使用表描述符设置Coprocessor时,不要设置优先级这一项,否则无法成功触发,如

1
'coprocessor' => '|org.apache.hbase.kora.coprocessor.RegionObserverExample|USER|'

    虽然也能成功设置Coprocessor,但是测试时是无法触发的,在上述环境中亲自测试过的,而且hbase帮助文档中优先级这个项用户不是必输项,只有类名是必输项。我们可以根据自己的需求来选择使用哪种方式来配置自己的Coprocessor。

分享到:
评论

相关推荐

    HBaseObserver:通过HBase Observer同步数据到ElasticSearch

    测试环境CDH 5.1.0HBase 0.98ElasticSearch 1.5.0使用Maven打包mvn clean compile assembly:single部署请参照:

    HbaseTemplate 操作hbase

    java 利用 sping-data-hadoop HbaseTemplate 操作hbase find get execute 等方法 可以直接运行

    pinpoint的hbase初始化脚本hbase-create.hbase

    搭建pinpoint需要的hbase初始化脚本hbase-create.hbase

    HBase(hbase-2.4.9-bin.tar.gz)

    HBase(hbase-2.4.9-bin.tar.gz)是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System...

    HBase数据库设计.doc

    1. HBase有哪些基本的特征? 1 HBase特征: 1 2. HBase相对于关系数据库能解决的问题是什么? 2 HBase与关系数据的区别? 2 HBase与RDBMS的区别? 2 3. HBase的数据模式是怎么样的?即有哪些元素?如何存储?等 3 1...

    HBase视频教程下载|基于微博数据应用的HBase实战开发

    在大数据热潮中,推出了NoSQL数据库,这种天生就为分布式存储而设计的技术,尤其以Apache HBase为代表,占领海量数据存储技术的大半壁江山。本教视从实战角度出来,向学员们手把手掌握HBase使用精髓,让学员达到如下...

    hbase-sdk是基于hbase-client和hbase-thrift的原生API封装的一款轻量级的HBase ORM框架

    hbase-sdk是基于hbase-client和hbase-thrift的原生API封装的一款轻量级的HBase ORM框架。 针对HBase各版本API(1.x~2.x)间的差异,在其上剥离出了一层统一的抽象。并提供了以类SQL的方式来读写HBase表中的数据。对...

    java大数据作业_3HBase

    1. 请用java集合的代码描述HBase的表结构 2. 请简述HBase中数据写入最后导致Region分裂的全过程 3. 如果设计一个笔记的表,表中要求有笔记的属性和笔记的内容,怎么做 4. HBase部署时如何指定多个zookeeper 5. HBase...

    Hbase资源整理集合

    HBase 官方文档.pdf HBase的操作和编程.pdf HBase Cpressr优化与实验 郭磊涛.pdf null【HBase】Data Migratin frm Gri t Clu Cmputing - Natural Sienes .pdf 分布式数据库HBase快照的设计与实现.pdf 【HBase】...

    HBase学习利器:HBase实战

    HBase开发实战,HBase学习利器:HBase实战

    hbase-2.3.5单机一键部署工具

    注意:zookeeper3.4.13和hbase2.3.5都是采用docker-compose方式部署 原文链接:https://blog.csdn.net/m0_37814112/article/details/120915194 说明:使用外部zookeeper3.4.13之hbase2.3.5一键部署工具,支持部署、...

    HBase开启审计日志

    HBase开启审计日志

    实验三:熟悉常用的HBase操作

    A.3实验三:熟悉常用的HBase操作 本实验对应第5章的内容。 A.3.1 实验目的 (1)理解HBase在Hadoop体系结构中的角色。(2)熟练使用HBase操作常用的 Shell命令。(3)熟悉HBase操作常用的 Java API。 A.3.2 实验平台 (1...

    HBase海量数据存储实战视频教程

    从HBase的集群搭建、HBaseshell操作、java编程、架构、原理、涉及的数据结构,并且结合陌陌海量消息存储案例来讲解实战HBase 课程亮点 1,知识体系完备,从小白到大神各阶段读者均能学有所获。 2,生动形象,化繁为...

    hbase资料api

    HBASE

    hbase 资源合集 hbase 企业应用开发实战 权威指南 hbase 实战 hbase 应用架构

    hbase 资源合集 hbase 企业应用开发实战 权威指南 hbase 实战 hbase 应用架构

    HBase3.0参考指南

    HBase3.0参考指南 This is the official reference guide for the HBase version it ships with. Herein you will find either the definitive documentation on an HBase topic as of its standing when the ...

    Hbase权威指南(HBase: The Definitive Guide)

    如果你正在寻找一种具备可伸缩性的存储解决方案来适应几乎没有穷尽的数据的话,这本书将可以向你表明apache hbase完全能够满足你的需求。作为google bigtable架构的开源实现,hbase能够支持数以十亿计的记录数和数以...

    HBase的图形化管理工具/Hbase的GUI工具

    由于网上下的不支持最新的hadoop,hbase 版本自己稍微修改了下,支持最新版本HBase的图形化管理工具,目前修改改为hadoop-2.7.1版本,hbase-1.1.2版本,依赖可以自己切换,源代码已经包括再里边了,如想修改直接修改...

    大数据开发之Hbase基本使用及存储设计实战教程(视频+笔记+代码)

    │ Day15[Hbase 基本使用及存储设计].pdf │ ├─02_视频 │ Day1501_Hbase的介绍及其发展.mp4 │ Day1502_Hbase中的特殊概念.mp4 │ Day1503_Hbase与MYSQL的存储比较.mp4 │ Day1504_Hbase部署环境准备.mp4 │ Day...

Global site tag (gtag.js) - Google Analytics