案例需求
编写协处理器,实现在往A表插入数据的同时让HBase自身(协处理器)向B表中插入一条数据。
实现步骤
1)创建一个maven项目,并引入以下依赖。
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.0.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>2.0.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
2)定义MyCoprocessor 类并继承RegionObserver, RegionCoprocessor接口
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.coprocessor.ObserverContext;
import org.apache.hadoop.hbase.coprocessor.RegionCoprocessor;
import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;
import org.apache.hadoop.hbase.coprocessor.RegionObserver;
import org.apache.hadoop.hbase.wal.WALEdit;
import java.io.IOException;
import java.util.Optional;
public class MyCoprocessor implements RegionObserver, RegionCoprocessor {
@Override
public Optional<RegionObserver> getRegionObserver() {
return Optional.of(this);
}
/**
* 在put动作之后执行的方法
* @param c
* @param put
* @param edit
* @param durability
* @throws IOException
*/
@Override
public void postPut(ObserverContext<RegionCoprocessorEnvironment> c, Put put, WALEdit edit, Durability durability) throws IOException {
//1、获取连接
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum","hadoop102:2181,hadoop103:2181,hadoop104:2181");
Connection connection = ConnectionFactory.createConnection(conf);
//2、获取Table
Table table = connection.getTable(TableName.valueOf("B"));
//3、封装数据
//4、插入
table.put(put);
//5、关闭
table.close();
connection.close();
}
}
3)打包放入HBase的lib目录下
4)分发jar包并重启HBase
5)建表时指定注册协处理器
在用Hbase API建表基础上添加如下语句
tableDescriptorBuilder.setCoprocessor(“com.demo.coprocessor.MyCoprocessor”);
注意: 还可以通过不重启的方式动态加载协处理器
1) 给hbase-site.xml中添加配置,防止协处理器异常导致集群停机(可选)
<property>
<name>hbase.coprocessor.abortonerror</name>
<value>false</value>
</property>
2) 打成jar包上传hdfs,比如存放路径为 hdfs://node1:9820/c1.jar
3) 禁用表: disable ‘A’
4) 加载协处理器:
alter 'A'.'coprocessor'=>'hdfs://node1:9820/c1.jar|com.demo.coprocessor.MyCoprocessor|1|'
alter ‘表名’, METHOD => ‘table_att’, ‘Coprocessor’=>‘jar所处HDFS路径| 协处理器所在的全类名|优先级|参数’
5) 启动表: enable ‘A’
6) 向A表插入数据,观察B表是否同步有数据插入