hbase建索引java api_hbase创建索引

本文介绍了如何使用HBase的Java API创建二级索引,包括代码实现、在Hadoop上创建文件、上传文件到HDFS、解绑命令、测试过程以及二级索引的潜在问题和解决策略。在实践中,需要注意权限设置、路径修正和配置文件的调整,以确保索引功能的正常运行。
摘要由CSDN通过智能技术生成

1.代码

package Test05;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.Cell;

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.client.Durability;

import org.apache.hadoop.hbase.client.HTable;

import org.apache.hadoop.hbase.client.Put;

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 classTestCoprocessor extends BaseRegionObserver {static Configuration config =HBaseConfiguration.create();static HTable table = null;static{

config.set("hbase.zookeeper.quorum","192.168.1.113.12:2181,192.168.1.113.13:2181,192.168.1.113.14:2181");try{

table= new HTable(config, "guanzhu");

}catch(Exception e) {

e.printStackTrace();

}

}

@Overridepublic void prePut(ObserverContexte,

Put put, WALEdit edit, Durability durability) throws IOException {//super.prePut(e, put, edit, durability);

byte[] row =put.getRow();

Cell cell= put.get("f1".getBytes(), "from".getBytes()).get(0);

Put putIndex= newPut(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());

putIndex.addColumn("f1".getBytes(), "from".getBytes(), row);

table.put(putIndex);

table.close();

}

}

上面这个代码有缺陷,只能索引一次结果。建议使用下面的

package Test05;

import java.io.IOException;

import org.apache.hadoop.hbase.Cell;

import org.apache.hadoop.hbase.CoprocessorEnvironment;

import org.apache.hadoop.hbase.client.Durability;

import org.apache.hadoop.hbase.client.HTableInterface;

import org.apache.hadoop.hbase.client.HTablePool;

import org.apache.hadoop.hbase.client.Put;

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;public classTestCoprocessor2 extends BaseRegionObserver {private HTablePool pool = null;

@Overridepublic voidstart(CoprocessorEnvironment env) throws IOException {

pool= new HTablePool(env.getConfiguration(), 10);

}

@Overridepublic void prePut(ObserverContexte,

Put put, WALEdit edit, Durability durability) throws IOException {

HTableInterface table1= pool.getTable(Bytes.toBytes("guanzhu"));byte[] rowkey =put.getRow();

Cell cell= put.get("f1".getBytes(), "from".getBytes()).get(0);

Put indexput= newPut(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());

indexput.add(Bytes.toBytes("f1"), Bytes.toBytes("from"), rowkey);

table1.put(indexput);

table1.close();

}

@Overridepublic voidstop(CoprocessorEnvironment env) throws IOException {

pool.close();

}

}

2.在hadoop创建文件

//普通集群

hdfs dfs -mkdir /hbasecp

//cdh

sudo -u hdfs hdfs dfs -mkdir /hbasecp

3.将文件上传hadoop-1

使用shell命令上传到hdfs

hadoop fs -put hbase-observer-elasticsearch-1.0-SNAPSHOT-zcestestrecord.jar /hbase_es

hadoop fs-chmod -R 777 /hbase_es

下面特殊

对CDH用户:假设系统有一个文件夹/user/directory,注意,这个文件夹的拥有者不是所谓的“root”。实际上,这个文件夹为“hdfs”所有(755权限,这里将hdfs理解为一个属于supergroup的用户)。

所以,只有hdfs可以对文件夹进行写操作。与Unix/Linux不同,hdfs是超级使用者(superuser),而不是root。

所以,当你想要进行创建文件夹或者上传文件等操作的时候,可以这么做:

sudo -u hdfs hdfs dfs -mkdir /user/intern/test67

///

sudo -u hdfs hdfs dfs -put myfile.txt /user/intern/test67显然,上面的方法麻烦在于:每当进行一次操作的时候,都需要切换成hdfs用户。这在spark-shell开发程序倒还好,但是对提交作业的时候,显然是很不方便的。

这里,我们可以创建一个文件夹,更改其权限为root(或你的用户名)。所以,你可以向这个文件夹随意的存、改文件了。

sudo-u hdfs hadoop fs -chown root /user/intern/test67

之后是

da4f7faf0244ec0c9133807971007e09.png

2ed6081be11c096bc7f064c9f54bcfed.png

4.以下是解绑的命令(这个是错误时删除使用)

//hbase shell命令

disable 'test_record'alter'test_record', METHOD => 'table_att_unset',NAME => 'coprocessor$1'enable'test_record'desc'test_record'

5.测试

hbase(main):017:0> put 'fensi','c','f1:from','b'

对fensi表添加数据,查看数据是guanzhu表里也有数据

f05d2ef069f287e7bf558f70b7273d9d.png

注意细节:

1.上面图片路径错误。正确的是:   alter 'fensi', METHOD => 'table_att', 'coprocessor' => 'hdfs:///hbasecp/cppp.jar|Test05.TestCoprocessor|1001|'

2.cdh坑略多自己慢慢试验最终的结果是下面这样的,有很多权限

23720147c99d33703a54cd0f7319b1e9.png

4a523ccb988947298e826ec5f9021b57.png

3.cdh将jar添加到hdfs上

4dfd27b2d15fc673ffc0f2dc1bd99218.png

14f583f004a46f47d540a47f9b8e4946.png

ecddfd5b7dad93a0ca01fca25941e93e.png

hbase建立索引参考:https://www.cnblogs.com/liuwei6/p/6837674.html

cdh修改权限参考:https://blog.csdn.net/g11d111/article/details/72902112

https://blog.csdn.net/m0_37739193/article/details/78544276

----------------------------------------------------------------------------------------------------------------------------------------------------------------

上面的方案角色分配:fensi是数据表,导数据(当满足jar的属性时数据会插到guanzhu表里,guanzhu表里是fensi表的rowkey索引)。guanzhu是索引表。

7bb34d4ea25e7578823725d6169a029d.png

二级索引的缺点

5e994b0e73cd52a6ae9f2e69478ad8e0.png

hbase创建索引不当时将会导致HRegionServer都挂掉,重启hbase也会挂掉。解决办法

修改hbase所有配置文件

vi hbase-site.xml

添加如下,关闭hbase的二级索引

hbase.coprocessor.abortonerror

false

重启hbase。然后删除带有索引的表,之后把hbase-site.xml上面这个刚刚添加的删除。即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值