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 class TestCoprocessor 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(); } } @Override public void prePut(ObserverContext<RegionCoprocessorEnvironment> e, 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 = new Put(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 class TestCoprocessor2 extends BaseRegionObserver { private HTablePool pool = null; @Override public void start(CoprocessorEnvironment env) throws IOException { pool = new HTablePool(env.getConfiguration(), 10); } @Override public void prePut(ObserverContext<RegionCoprocessorEnvironment> e, 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 = new Put(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()); indexput.add(Bytes.toBytes("f1"), Bytes.toBytes("from"), rowkey); table1.put(indexput); table1.close(); } @Override public void stop(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
之后是
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表里也有数据
注意细节:
1.上面图片路径错误。正确的是: alter 'fensi', METHOD => 'table_att', 'coprocessor' => 'hdfs:///hbasecp/cppp.jar|Test05.TestCoprocessor|1001|'
2.cdh坑略多自己慢慢试验最终的结果是下面这样的,有很多权限
3.cdh将jar添加到hdfs上
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是索引表。
二级索引的缺点
hbase创建索引不当时将会导致HRegionServer都挂掉,重启hbase也会挂掉。解决办法
修改hbase所有配置文件 vi hbase-site.xml
添加如下,关闭hbase的二级索引
<property>
<name>hbase.coprocessor.abortonerror</name>
<value>false</value>
</property>
重启hbase。然后删除带有索引的表,之后把hbase-site.xml上面这个刚刚添加的删除。即可