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

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

    标题 "HBaseObserver:通过HBase Observer同步数据到ElasticSearch" 涉及到的是在大数据处理领域中,如何实现在HBase数据库与ElasticSearch之间进行数据同步的技术方案。这里主要介绍HBase Observer机制以及它如何与...

    Hbase同步数据到Solr的方案

    HBase 和 Solr 都是大数据处理中的关键组件。HBase 是一个分布式的、面向列的NoSQL数据库,适合存储大规模结构化数据。而Solr 是一个流行的全文搜索引擎,提供高效的全文检索、命中高亮、拼写检查等特性。将HBase的...

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

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

    使用Hbase协作器(Coprocessor)同步数据到ElasticSearch(hbase 版本 1.2.0-cdh5.8.0, es 2.4.0 版本)

    在提供的压缩包文件"**Hbase-Observer-ElasticSearch**"中,可能包含了实现这个功能的源代码示例。这些代码可以帮助开发者理解如何集成HBase和Elasticsearch,以及如何编写和配置Coprocessor。通过学习和参考这些...

    超全的HBase知识体系总结.pdf

    HBase通过observer和endpoint两种形式的协处理器来扩展其功能。 12. 在HBase调优方面,涵盖了通用优化、Linux系统优化、HDFS优化、MapReduce优化以及HBase本身、内存、JVM和Zookeeper的优化策略。通过适当调优,...

    hbase的java client实例

    在分布式大数据存储领域,HBase是一个非常重要的列式数据库,尤其在处理海量实时数据时表现卓越。本主题将深入探讨如何使用Java客户端API与HBase进行交互,包括集成Spring、MapReduce实例以及协处理器的使用。 首先...

    hbase-hadoop+database系统入门书籍

    - **高级功能**:HBase还提供了更多的高级功能,如过滤器(Filter)、批量操作(Batch)、观察者(Observer)等。 ### 面向的目标受众 该教程主要面向以下几类人群: - **希望从事大数据分析领域的专业人士**:包括软件...

    HBase Coprocessor 优化与实验

    ### HBase Coprocessor 优化与实验 #### HBase及Coprocessor概述 HBase是一种非关系型、面向列的分布式数据库系统,它基于Hadoop之上构建,旨在为大规模数据提供高可靠、高性能的支持。HBase的核心优势在于其能够...

    hbase_coprocessor_hbase_coprocessorjava_源码

    Observer是监控HBase操作的轻量级钩子,例如在数据写入前或读取后执行特定逻辑;Endpoint则用于执行更复杂的任务,如聚合计算。 在Java API中,开发HBase Coprocessor涉及以下核心类: 1. `CoprocessorService`...

    hbase-solr-coprocessor:通过solr实现hbase二级索引,主要通过hbase的coprocessor的Observer实现

    主要通过hbase的coprocessor的Observer实现,通过coprocessor在记录插入hbase时向solr中创建索引。 项目核心为SolrIndexCoprocessorObserver,该类继承BaseRegionObserver,并实现postPut和postDelete方法,以实现...

    HBase-coprocessor.pptx

    1. Observer:Observer是运行在Region Server上的,它监听并响应HBase的各种操作,如RegionObserver、RegionServerObserver、MasterObserver、WALObserver和BulkLoadObserver。例如,RegionObserver可以用于在数据...

    HBaseCoprocessor的实现与应用.pdf

    HBase Coprocessor 为 HBase 提供了极大的灵活性和可扩展性,通过 Endpoint 和 Observer 接口,不仅可以提高数据处理的效率,还能简化复杂的业务逻辑。无论是实现高效的聚合操作还是创建和维护二级索引,Coprocessor...

    hbase reginobserver

    - 在HBase表的元数据中配置Observer,指定Observer类的位置和加载顺序。 5. **使用示例** 一个简单的示例可能是实现一个预写日志(Pre-Written Log, PLOG)的RegionObserver,它在数据写入HBase之前记录每个Put...

    Hbase coprecessor

    通过引入 Observer 和 Endpoint 机制,HBase 不仅能更好地支持复杂的数据处理需求,还能在安全性方面提供更强大的保障。未来,随着 HBase 的不断发展和完善,Coprocessor 的应用场景将会更加广泛,为用户提供更多...

    ZooKeeper 原理及其在 Hadoop 和 HBase 中的应用

    ### ZooKeeper原理及其在Hadoop和HBase中的应用 #### ZooKeeper概述 ZooKeeper是一个由雅虎开发的开源分布式协调服务系统,旨在为分布式应用提供一致性和可靠性支持。它是Google Chubby系统的开源版本,主要功能...

    大数据平台-HBASE

    **大数据平台-HBASE详解** HBASE是一个基于Hadoop Distributed File System (HDFS)构建的NoSQL分布式数据库系统,专门设计用于处理大规模数据。它具备高可靠性和高性能,并且支持列式存储、可扩展性以及实时读写...

    HBaseCoprocessor的实现与应用.zip

    2. **Coprocessor类型**:HBase中的Coprocessor分为两种类型:Observer和Endpoint。Observer是在特定操作(如Get、Put、Scan等)执行时被调用,用于拦截并修改操作行为;Endpoint则更像是服务,可以在RegionServer上...

    基于协处理器的HBase分类二级索引设计.pdf

    在IT领域,尤其是在大数据存储和检索的环境下,HBase作为一种分布式、面向列的NoSQL数据库,因其高效的数据处理能力和大规模数据存储能力而被广泛应用。本文将深入探讨如何利用协处理器(Coprocessor)机制在HBase中...

    HBaseExamples:HBase 代码示例用作更复杂工作的起点

    包括一些有用的协处理器示例,其中一个用于 Observer 协处理器,以及更复杂的 Endpoint 协处理器示例。 端点协处理器/ 包括用于需要使用 Google Protocol Buffers 进行编译并用作序列化介质的较新版本 HBase 的协...

Global site tag (gtag.js) - Google Analytics