SecondaryIndexAutoUpdate.java package com.bd17.observer;import java.io.IOException;import java.util.List;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.Cell;import org.apache.hadoop.hbase.CellUtil;import org.apac
package com.bd17.observer; import java.io.IOException; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.Durability; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Table; 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.wal.WALEdit; import org.apache.hadoop.hbase.util.Bytes; //使用observer的coprocessor来自动更新order_item二级索引数据 //create 'order_item','i' //create 'order_item_subtotal_index','r' //把这个协处理器添加到order_item表上,索引数据自动更新到order_item_subtotal_index里 public class SecondaryIndexAutoUpdate extends BaseRegionObserver{ /* * 在表数据被put之前执行索引表数据的添加 * @ put 待被插入到 bd17:order_item 表中的 put 对象 */ @Override public void prePut(ObserverContexte, Put put, WALEdit edit, Durability durability) throws IOException { // 参数 put 中就是要保存近 bd17:order_item 的put 对象,从中获取 subtotal 和 rowkey // 保存到 bd17:order_item_subtotal_index 中 List subtotalCell = put.get(Bytes.toBytes("i"), Bytes.toBytes("subtotal")); if (subtotalCell !=null && subtotalCell.size() > 0) { RegionCoprocessorEnvironment environment = e.getEnvironment(); Configuration conf = environment.getConfiguration(); Connection conn = ConnectionFactory.createConnection(conf); Table table = conn.getTable(TableName.valueOf("bd17:order_item_subtotal_index")); // 构建要保存索引数据的 put 对象 Put indexPut = new Put(CellUtil.cloneValue(subtotalCell.get(0))); indexPut.addColumn(Bytes.toBytes("i"), put.getRow(), null); table.put(indexPut); table.close(); } } // 步骤1. 创建项目,添加 hbase 依赖,在项目定义 observe 类,继承 BaseRegionObserver 类,重写方法实现 监听触发的功能 // 2. 项目打包成 jar 包,放到 hdfs 上 // alter 'bd17:order_item','coprocessor'=>'hdfs:///coprocessor.jar|com.zhiyou.bd17.observer.SecondaryIndexAutoUpdate|1001|' // 3. 把协处理器添加到表 bd17:order_item 上,实现监听 } |