分享

使用hbase coprocessor测试二级索引未生效,求检查

louiscool2 发表于 2016-1-29 11:46:12 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 6 15135
使用hbase coprocessor未生效
测试表
create 'test', {NAME=>'info'}
索引表
create 'testi', {NAME=>'keys'}

alter 'test',METHOD=>'table_att','coprocessor'=>'hdfs://ip:端口/user/hl/test/myhbase.jar|test.HbaseCoprocessor|1001'

往test表put数据
put 'test','row1','info:1','hello0'
发现索引表testi是没有数据
scan 'testi'
在hbase日志里grep日志出来Loaded coprocessor是成功的
regionserver.RegionCoprocessorHost: Loaded coprocessor test.HbaseCoprocessor from HTD of test successfully.

test.HbaseCoprocessor源代码
public class HbaseCoprocessor extends BaseRegionObserver {

        public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e,
                        final Put put, final WALEdit edit, final boolean writeToWAL)
                        throws IOException {
                // set configuration
                Configuration conf = new Configuration();
                // need conf.set...
                String colName = "1";
                HTable table = new HTable(conf, "testi");
                List<Cell> kv = put.get("info".getBytes(), "1".getBytes());
                Iterator<Cell> kvItor = kv.iterator();
                while (kvItor.hasNext()) {
                        Cell tmp = kvItor.next();
                        Put indexPut = new Put(tmp.getValue());
                        indexPut.add("keys".getBytes(), "1".getBytes(),
                                        tmp.getRow());
                        table.put(indexPut);
                }
                table.close();
        }

}



已有(6)人评论

跳转到指定楼层
when30 发表于 2016-1-29 16:05:01
楼主是安札欧下面步骤的来的吗?特别是第一步和第三步
步骤:
1.首先disable ‘表名’
2.然后修改表
[mw_shl_code=bash,true]alter 'LogTable',METHOD=>'table_att','coprocessor'=>'hdfs:///test.jar|www.aboutyun.com.hbase.HbaseCoprocessor|1001'[/mw_shl_code]


3.enable '表名'

回复

使用道具 举报

395455030 发表于 2016-1-31 15:28:40
本帖最后由 395455030 于 2016-1-31 16:16 编辑

    。。。。。。这楼不小心多发了。
回复

使用道具 举报

395455030 发表于 2016-1-31 16:14:33
本帖最后由 395455030 于 2016-1-31 16:18 编辑

    楼主,我最近也在做HBase的二级索引,我们可以交流一下,我用和你差不多的程序,可以向索引表写值,要说和你的差别,正如楼上说的,要多做disable和enable。
    但是当我向主表写入key=rk0003,value=b33时,索引表想要的结果是这样:
key=b33,value=rk0003
    实际是这样:
key=\x00\x00\x00\x1A\x00\x00\x00\x03\x00\x06rk0003\x04infoname\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x04b33,value=\x00\x00\x00\x1A\x00\x00\x00\x03\x00\x06rk0003\x04infoname\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x04b33
    多出了很多乱码。楼主加disable、enable试试,看会有我这样的结果吗?
回复

使用道具 举报

louiscool2 发表于 2016-2-1 18:20:35
试过diable enable,还是一样,你把你的java项目压缩发我下,我试试?邮箱louiscool@126.com
回复

使用道具 举报

395455030 发表于 2016-2-2 12:59:39
louiscool2 发表于 2016-2-1 18:20
试过diable enable,还是一样,你把你的java项目压缩发我下,我试试?邮箱

和你的几乎没有差别啊。经测试动作写在postPut、prePut都可以,最后一个参数是Durability durability还是boolean writeToWAL也都一样。

package com;
import java.util.Iterator;
import java.util.List;
import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
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;

public class HbaseCoprocessor extends BaseRegionObserver
{
  public void postGetOp(ObserverContext<RegionCoprocessorEnvironment> e,
    Get get, List<Cell> results)
  {
    System.out.println("postGetOp");
  }
  public void postPut(ObserverContext<RegionCoprocessorEnvironment> e,
    Put put, WALEdit edit, Durability durability)
  {
    System.out.println("postPut");
    try{
      Configuration conf = new Configuration();

      HTable table = new HTable(conf, "indexTable");
      List<Cell> kv = put.get(Bytes.toBytes("info"),Bytes.toBytes("name"));
      Iterator<Cell> kvItor = kv.iterator();
      while (kvItor.hasNext()) {
        Cell tmp = kvItor.next();
        Put indexPut = new Put(CellUtil.cloneValue(tmp));
        indexPut.addColumn("value".getBytes(), "".getBytes(), CellUtil.cloneRow(tmp));
        table.put(indexPut);
      }
      table.close();
    }catch(Exception exc){
      System.out.println("Error:"+exc.toString());
    }
  }
  public void preGetOp(final ObserverContext e, final Get get,
    final List results)
  {
    System.out.println("preGetOp");
  }
  public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e,
    final Put put, final WALEdit edit, final boolean writeToWAL)
//final boolean writeToWAL
//    throws Exception
  {
    //System.out.println("prePut");

  }
}

回复

使用道具 举报

wx_sZwPbw09 发表于 2017-2-19 21:04:00
之前我也和楼主的写法差不多,但把指向的路径改成hdfs:///test.jar……不用IP和端口然后再运行就可以了,哎,书本中写的东西也有错的,实践才是硬道理。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条