观察者的设计意图是允许用户通过插入代码来重载协处理器框架的upcall方法,而具体的事件触发的callback方法由HBase的核心代码来执行。协处理器框架处理所有的callback调用细节,协处理器自身只需要插入添加或者改变的功能。
以HBase它提供了三种观察者接口:
RegionObserver:提供客户端的数据操纵事件钩子:Get、Put、Delete、Scan等。
WALObserver:提供WAL相关操作钩子。
MasterObserver:提供DDL-类型的操作钩子。如创建、删除、修改数据表等。
自定义observer
package coprocessortest;
import java.io.IOException;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.coprocessor.BaseMasterObserver;
import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;
import org.apache.hadoop.hbase.coprocessor.ObserverContext;
import com.sun.org.apache.commons.logging.Log;
import com.sun.org.apache.commons.logging.LogFactory;
/**
* hbase提供了类似于触发器的组件observer,类似于存储过程的endpoint。
* hbase中的observer分别三类,MasterObserver、RegionObserver、WALObserevr
* 使用java代码也可以达到相同的效果,但是服务器端的observer相对是比较高效的
* @author 韩利鹏
*/
public class CoprocessorTest extends BaseMasterObserver{
Log log = LogFactory.getLog(CoprocessorTest.class);
//在删除table之前做的动作
@Override
public void preDeleteTable(ObserverContext<MasterCoprocessorEnvironment> ctx, TableName tableName)
throws IOException {
log.info("--------------------------start delete table------------------"+tableName);
}
//在删除table之后做的动作
@Override
public void postDeleteTable(ObserverContext<MasterCoprocessorEnvironment> ctx, TableName tableName)
throws IOException {
/*// TODO Auto-generated method stub
super.postDeleteTable(ctx, tableName);*/
log.info("-----------------------------having delete table-----------------------"+tableName);
}
}
要想是自己写的自定类起作用不要吧这个类打成jar包,上传到hbase的lib目录下
然后再hbase-default.xml文件中的配置修改为(可能有默认值,有默认值只需要修改value就好了)
<property>
<name>hbase.coprocessor.master.classes</name>
<value>com.lanyun.hadoop2.MyObserver</value>
</property>
重启hbase集群,然后见表,观察log日志的变化