我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Hbase0.98.4中部署用户自定义的Observer Coprocessor

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Hbase0.98.4中部署用户自定义的Observer Coprocessor

    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的名字:



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,弹出如下窗口

Hbase0.98.4中部署用户自定义的Observer Coprocessor

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

Hbase0.98.4中部署用户自定义的Observer Coprocessor

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

## 已经上传到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

    然后需要将打好的jar包放到hbase安装目录下的lib目录下,并修改hbase-site.xml配置文件

## cp jar包到hbase安装目录下的lib目录,所有节点上都做这样的操作
[grid@hadoop1 ~]$ cp /var/ftp/pub/RegionObserverExample.jar /opt/hbase-0.98.4-hadoop2/lib/

## 然后修改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使配置生效。重启之后来看是否能够正确的触发

## 使用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,就需要使用表描述符的加载方式,这种方式同样的需要拷贝jar包到hbase安装目录下的lib目录中去,与上面不同的是不用在hbase-site.xml中设置Coprocessor,而是使用alter来把Coprocessor与表绑定。如下

## cp jar包到hbase安装目录下的lib目录,所有节点上都做这样的操作
[grid@hadoop1 ~]$ cp /var/ftp/pub/RegionObserverExample.jar /opt/hbase-0.98.4-hadoop2/lib/

## 注释掉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

## 格式:[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下表

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,已经设置成功,下面来测试一下

## 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时,不要设置优先级这一项,否则无法成功触发,如

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

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


    

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Hbase0.98.4中部署用户自定义的Observer Coprocessor

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL 中的用户定义变量与局部变量?

用户定义的变量也称为会话特定变量。它是一种松散类型变量,可以在会话中的某个位置进行初始化,并包含用户定义变量的值,直到会话结束。用户定义变量以符号 @ 为前缀。例如:@anyVariableName;有两种方法可以初始化用户定义的变量。您可
2023-10-22

SAP云平台CloudFoundry中的用户如何自定义变量

SAP云平台CloudFoundry中的用户如何自定义变量,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。CloudFoundry应用的manifest.xml里的env区域
2023-06-04

详解WPF中用户控件和自定义控件的使用

无论是在WPF中还是WinForm中,都有用户控件(UserControl)和自定义控件(CustomControl),这两种控件都是对已有控件的封装,实现功能重用。但是两者还是有一些区别,本文对这两种控件进行讲解
2023-03-02

详解Android XML中引用自定义内部类view的四个why

今天碰到了在XML中应用以内部类形式定义的自定义view,结果遇到了一些坑。虽然通过看了一些前辈写的文章解决了这个问题,但是我看到的几篇都没有完整说清楚why,于是决定做这个总结。 使用自定义内部类view的规则 本文主要是总结why,所以
2022-06-06

如何在 Kubernetes 中返回自定义的用户友好错误消息?

在 Kubernetes 中,当出现错误时,默认返回的错误消息通常是技术性的、难以理解的,对于普通用户来说并不友好。然而,通过一些简单的配置和自定义操作,我们可以在 Kubernetes 中返回自定义的用户友好错误消息。在本文中,php小编
如何在 Kubernetes 中返回自定义的用户友好错误消息?
2024-02-09

实例解析:ASP 用户控件与自定义控件在实际项目中的应用

ASP 用户控件和自定义控件都是 ASP.NET 中用于重用代码和提高开发效率的控件,它们之间存在一些差异,本文将通过实例解析 ASP 用户控件和自定义控件在实际项目中的应用。
实例解析:ASP 用户控件与自定义控件在实际项目中的应用
2024-02-22

如何使用golang中的net/http/httputil.NewProxyClient函数实现自定义的HTTP代理客户端

如何使用golang中的net/http/httputil.NewProxyClient函数实现自定义的HTTP代理客户端在网络请求中,我们有时需要通过代理服务器来发送和接收HTTP请求。Go语言提供了一个方便的函数httputil.New
如何使用golang中的net/http/httputil.NewProxyClient函数实现自定义的HTTP代理客户端
2023-11-18

Java如何使用用户自定义的比较函数对数组中的键名进行排序

Java中可使用Arrays.sort()方法对数组键名进行自定义排序。首先创建自定义比较函数,实现Comparator接口的compare()方法,指定键名大小比较逻辑。然后在Arrays.sort()中传入自定义比较函数作为参数。该方法将按指定逻辑对键名进行排序。示例代码展示了按忽略大小写顺序排序键名的过程。通过自定义比较函数,可根据特定需求对键名进行灵活排序。
Java如何使用用户自定义的比较函数对数组中的键名进行排序
2024-04-02

PHP如何使用用户自定义的比较函数对数组中的键名进行排序

PHP提供了ksort()和krsort()函数用于按键名排序,但默认按ASCII值排序。要按自定义逻辑排序,需使用回调函数作为比较函数,接受两个键名参数并返回整数。PHP提供uksort()和ukrsort()函数,使用自定义比较函数对键名排序。示例演示了如何按键名的长度排序:自定义比较函数返回键名长度差值。uksort()使用该函数对数组键名排序,输出按长度递增的数组。自定义比较函数应返回整数,并能接收其他参数,但需在调用uksort()或ukrsort()时指定。
PHP如何使用用户自定义的比较函数对数组中的键名进行排序
2024-04-02

Java如何使用用户自定义函数对数组中的每个元素做回调处理

Java中使用用户自定义函数对数组元素进行回调处理的步骤如下:定义用户自定义函数;创建数组;使用StreamAPI,通过lambda表达式或方法引用传递自定义函数;理解映射操作,将函数应用于每个元素。优势:可重用性:函数可重复使用,执行同一操作;灵活:自定义函数可定义特定操作;简洁:语法简洁;并行处理:提升大数组处理效率。
Java如何使用用户自定义函数对数组中的每个元素做回调处理
2024-04-02

PHP如何使用用户自定义函数对数组中的每个元素做回调处理

PHP中使用用户自定义函数对数组元素执行回调可利用array_map()函数。回调函数作为参数传递,执行特定操作,常用于类型转换、字符串处理、数组元素过滤、数学运算或创建新数组。该函数可同时处理多个数组,通过闭包或匿名函数传递更复杂的逻辑。array_map()简化了对数组每个元素进行自定义操作的任务,提供广泛的处理可能性。
PHP如何使用用户自定义函数对数组中的每个元素做回调处理
2024-04-02

拥抱新技术:ASP 用户控件与自定义控件在现代Web开发中的价值

ASP 用户控件和自定义控件是现代 Web 开发中强大的工具,可帮助开发者创建可重用、可维护和可扩展的代码。本文将探讨这些控件的优势以及如何有效地利用它们来构建更强大的 Web 应用程序。
拥抱新技术:ASP 用户控件与自定义控件在现代Web开发中的价值
2024-02-22

PHP如何使用用户自定义的比较函数对数组中的值进行排序并保持索引关联

PHP中使用自定义比较函数对数组进行排序,保持索引关联。usort()和uksort()函数用于按值或键进行排序。自定义比较函数返回整数表示比较结果:正数(大于)、零(相等)、负数(小于)。示例包括按长度、数字大小和键字母顺序排序。注意比较函数仅比较元素值,以保留索引关联。
PHP如何使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
2024-04-02

Java如何使用用户自定义的比较函数对数组中的值进行排序并保持索引关联

Java中使用自定义比较函数对数组排序并保持索引关联的方法:定义一个实现Comparator接口的比较函数类,指定排序规则。使用Arrays.sort()方法对数组排序,并传入自定义比较函数作为第二个参数。获取Arrays.sort()返回的索引数组,以获得元素在排序前后的索引。通过自定义比较函数,可以按特定规则排序数组并保留索引,实现更灵活的排序需求。
Java如何使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
2024-04-02

编程热搜

目录