本文主要给大家罗列了hbase协处理器加载的三种方式:shell加载(动态)、api加载(动态)、配置文件加载(静态)。其中静态加载方式需要重启hbase。
我们假设我们已经有一个现成的需要加载的协处理器jar包:hellocoprocessor-0.0.1.jar。
将打包好的hellocoprocessor-0.0.1.jar上传服务器,然后放到hdfs上。
# 切换hadoop用户,创建演示目录 $ hdfs dfs -mkdir /usr/hbase/coprocessor $ hdfs dfs -put hellocoprocessor-0.0.1.jar /usr/hbase/coprocessor
我们假设其协处理器类的包名为:
org.myname.hbase.coprocessor.regionobserverexample
shell 操作如下:
hbase> disable 'mytable' # 禁用表,可选 hbase> alter 'mytable', method => 'table_att', 'coprocessor' => '/usr/hbase/coprocessor/hellocoprocessor-0.0.1.jar'|org.myname.hbase.coprocessor.regionobserverexample|1001|arg1=1,arg2=2' hbase> enable 'mytable' # 禁用表后启用表,可选
结构如下:
hbase> alter 'mytable', method => 'table_att', 'coprocessor' => ①|②|③|④'
解释下上面各个参数:
①:协处理器jar包路径,要保证所有的regionserver可读取到。也可以是本地路径,不过建议是放在hdfs上。
②:协处理器的完整类名。
③:协处理器优先级,整数表示。可以为空。
④:传递给协处理器的参数,可以为空。
注:各参数间不要有空格。
hbase> desc 'mytable' table mytable is enable mytable, {table_attributes => {coprocessor$1 => '/usr/hbase/coprocessor/hellocoprocessor-0.0.1.jar'|org.myname.hbase.coprocessor.regionobserverexample|1001|arg1=1,arg2=2'}}
此验证不保证协处理器能正常工作:shell命令既不保证特定位置存在jar文件,也不验证给定类是否实际包含在jar文件中。
hbase> disable 'mytable' # 禁用表,可选 hbase> alter 'mytable', method => 'table_att_unset', name => 'coprocessor$1' hbase> enable 'mytable' # 禁用表后启用表,可选
坑:在没有重启hbase情况下,如果修改协处理器代码并重新加载协处理器,请重命名协处理器jar包的名字,否则不会生效。(由于当前jvm引用了现有的协处理器,因此必须通过重新启动regionserver来重新启动jvm,以便替换它。)
具体方法是调用htabledescriptor的addcoprocessor方法。该方法有两个重载方法:
示例代码如下:
tablename tablename = tablename.valueof("mytable"); path path = new path("hdfs://<namenode>:<port>/usr/hbase/coprocessor/hellocoprocessor-0.0.1.jar"); configuration conf = hbaseconfiguration.create(); connection connection = connectionfactory.createconnection(conf); admin admin = connection.getadmin(); admin.disabletable(tablename); htabledescriptor htabledescriptor = new htabledescriptor(tablename); hcolumndescriptor columnfamily1 = new hcolumndescriptor("f1"); columnfamily1.setmaxversions(1); htabledescriptor.addfamily(columnfamily1); hcolumndescriptor columnfamily2 = new hcolumndescriptor("f2"); columnfamily2.setmaxversions(3); htabledescriptor.addfamily(columnfamily2); htabledescriptor.addcoprocessor('org.myname.hbase.coprocessor.regionobserverexample', path, coprocessor.priority_user, null); admin.modifytable(tablename, htabledescriptor); admin.enabletable(tablename);
重新加载表定义,无需使用addcoprocessor()方法设置协处理器的值。这将删除附加到表的任何协处理器。
1.1 regionobservers/endpoints
<property> <name>hbase.coprocessor.region.classes</name> <value>org.myname.hbase.coprocessor.regionobserverexample</value> </property>
1.2 walobservers
<property> <name>hbase.coprocessor.wal.classes</name> <value>org.myname.hbase.coprocessor.regionobserverexample</value> </property>
1.3 masterobservers
<property> <name>hbase.coprocessor.master.classes</name> <value>org.myname.hbase.coprocessor.regionobserverexample</value> </property>
如果想同时配置多个协处理器,可以用逗号分隔多个协处理器的类名。
将您的代码放在hbase的类路径上。一种简单的方法是将jar(包含代码和所有依赖项)放入hbase的安装目录lib/中。
转载请注明出处!欢迎关注本人微信公众号【hbase工作笔记】
如对本文有疑问, 点击进行留言回复!!
去 HBase,Kylin on Parquet 性能表现如何?
如何找到Hive提交的SQL相对应的Yarn程序的applicationId
如何在 HBase Shell 命令行正常查看十六进制编码的中文?哈哈~
网友评论