HBase单节点下JavaAPI连接

Posted 健哥说编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HBase单节点下JavaAPI连接相关的知识,希望对你有一定的参考价值。

使用Java代码连接单节点下安装的Hbase


以前,从来没有直接连接过单一节点下的hbase,因为没有必要,也不会这样来配置。看过<权威>以后,可知单节点下的HMaster进程中,也包含了HRegionServerzookeeper进程。知道zookeeper进程默认情况下,所占用的端口为2181。为了确认是否2181是被HMaster进程所占用,可以使用以下查询:

1、先查询HMaster进程,所占用的进程id

[wangjian@hadoop91 ~]$ jps

2388 Main

2503 Jps

1934 HMaster

通过上面的结果,可知,HMaster进程所占用的id1934

2、使用netstat命令查看端口是被哪一个进程占用

[wangjian@hadoop91 ~]$ sudo netstat -antlp | grep 2181

tcp6  0  0 :::2181       :::*   LISTEN      1934/java     

tcp6 0   0 127.0.0.1:39250  127.0.0.1:2181 ESTABLISHED 1934/java   

tcp6   0   0 ::1:2181   ::1:56708   ESTABLISHED 1934/java    

tcp6   0   0 127.0.0.1:2181  127.0.0.1:39248 ESTABLISHED 1934/java    

tcp6   0   0 127.0.0.1:2181  127.0.0.1:39280  ESTABLISHED 1934/java      tcp6   0  0 ::1:56710   ::1:2181    ESTABLISHED 1934/java

通过上面的命令可知,2181端口,已经被1934这个进程占用。而这个进程,就是HMaster进程的id

 

1、添加hbase的依赖

<dependency>

<groupId>org.apache.hbase</groupId>

<artifactId>hbase-client</artifactId>

<version>1.2.6.1</version>

</dependency>

 

查看整个依赖树的关系:

 

通过查看上面的依赖树,可知hbase-client依赖:

Hbasezookeeperhadoop。且hadoop的版本为2.5

 


2JavaAPI显示所有表名

package cn.wangjian.hbase;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.TableName;

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

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

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

/**

 * 测试连接Hbase-连接单一节点的HBase,很少这样做

 * @author wangjian

 * @version 1.0 2018年6月15日

 */

public class Demo01_Conn {

public static void main(String[] args) throws Exception {

Configuration config = HBaseConfiguration.create();

//看到了吧,连接的是zookeeper

config.set("hbase.zookeeper.quorum", "hadoop91:2181");

Connection con =  ConnectionFactory.createConnection(config);

System.out.println("Conn is:"+con);//Conn is:hconnection-0x3dfc5fb8

Admin admin =  con.getAdmin();

TableName[] tns =  admin.listTableNames();

for(TableName tn:tns) {//[stud,..]

//这儿将所有表名

System.out.println(tn.getNameAsString());//由于是字节数组,所以需要转成字符串

}

con.close();

}

}

运行显示的结果:

Conn is:hconnection-0x3dfc5fb8

Stud

 

3、打包以后在Linux上运行

Eclipsemaven项目中,使用mvn:package打包hbase项目。将打好的包,发到linux上,执行以下命令:

[wangjian@hadoop91 ~]$ export CLASSPATH=/app/hbase-1.2.6.1/*:/app/hbase-1.2.6.1/lib/*:/home/wangjian/hbase.jar

[wangjian@hadoop91 ~]$ java cn.wangjian.hbase.Demo01_Conn

输出结果:

Conn is:hconnection-0x101df177

Stud

【上面输出的结果中,省略的一些日志的输出,并于日志,请修改log4j.properties文件,在打包的项目中,也有一个log4j.properties文件】

注意,如果是发布到linux服务上运行则可以删除以下一句:

//config.set("hbase.zookeeper.quorum", "hadoop91:2181");

4、更多操作

说明:

1、所有操作都基于先创建一个ConnectionHBaseAdmin对象。

2、使用Java代码操作HBase,连接的对象为zookeeper2181端口。

3、以下代码为通用连接单一节点HBase的代码:

Configuration config = HBaseConfiguration.create();

config.set("hbase.zookeeper.quorum", "hadoop91:2181");

Connection con =  ConnectionFactory.createConnection(config);

Admin admin =  con.getAdmin();

1、创建一个表

package cn.wangjian.hbase;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.HColumnDescriptor;

import org.apache.hadoop.hbase.HTableDescriptor;

import org.apache.hadoop.hbase.TableName;

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

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

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

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

/**

 * 创建一个HBase表的测试

 * @author wangjian

 * @version 1.0 2018年6月15日

 */

public class Demo02_Create {

public static void main(String[] args) throws Exception {

Configuration config = HBaseConfiguration.create();

config.set("hbase.zookeeper.quorum","hadoop91:2181");

Connection con = ConnectionFactory.createConnection(config);

Admin admin = con.getAdmin();

HBaseAdmin ha = (HBaseAdmin) admin;

//声明表

HTableDescriptor table = new HTableDescriptor(TableName.valueOf("persons"));

table.addFamily(new HColumnDescriptor("info"));

ha.createTable(table);

System.out.println("创建成功...");

con.close();

}

}

 

创建成功以后,通过desc检查表的信息:

hbase(main):007:0> desc "persons"

Table persons is ENABLED  

persons                         

COLUMN FAMILIES DESCRIPTION       

{NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCO

DING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', RE

PLICATION_SCOPE => '0'}               

1 row(s) in 0.1790 seconds

 

2、查询所有表

TableName[] tns =  admin.listTableNames();

for(TableName tn:tns) {//[stud,..]

System.out.println(tn.getNameAsString());//由于是字节数组,所以需要转成字符串

}

3、向表中写入记录

Table table =  connection.getTable(TableName.valueOf("stud"));//获取某个table对象

Put put  = new Put("S001".getBytes());//构造参数为rowkey

//参数说明:列族,列名,列值

put = put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"),Bytes.toBytes("Jack"));

table.put(put);//保存数据

 

4、批量向表中写入记录

Table table = connection.getTable(TableName.valueOf("stud"));// 获取某个table对象

List<Put> list = new ArrayList<Put>();

for (int i = 0; i < 10; i++) {

Put put = new Put(("S00"+i).getBytes());// 构造参数为rowkey

// 参数说明:列族,列名,列值

put = put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("Jack"+i));

list.add(put);

}

table.put(list);//接收List集合,一次保存多行

 

5、遍历数据

一个表,有很多的行,每一行用一个行键唯一标识。而一个行,可以有多个列族,每一个列族又可以有多个列名即列标识。所以,遍历的方式应该是,先遍历行,再遍历所有的单元格。每一个单元格,都有列族、列标识即列名、值等组成。

假设通过以下的查询,存在以下数据:

hbase(main):023:0> scan "stud"

ROW     COLUMN+CELL

S000    column=info:name, timestamp=1529145971909, value=Jack0

S001   column=info:age, timestamp=1529154924994, value=44

S001    column=info:name, timestamp=1529154777494, value=Jerry

S001  column=info:sex, timestamp=1529154955489, value=Male

注意上面S001三条记录中的列族的标识不同。

使用以下Java代码对数据进行遍历:

Table table = connection.getTable(TableName.valueOf("stud"));

ResultScanner rs =  table.getScanner(Bytes.toBytes("info"));//指定列族查询

for(Result result:rs) {

String rowKey = Bytes.toString(result.getRow());

System.out.println("行键:"+rowKey);

CellScanner cellScanner =  result.cellScanner();//数据

while(cellScanner.advance()) {

Cell cell =  cellScanner.current();

System.out.print(Bytes.toString(CellUtil.cloneFamily(cell)));

System.out.print(":"+Bytes.toString(CellUtil.cloneQualifier(cell)));

System.out.print("\tvalue:"+Bytes.toString(CellUtil.cloneValue(cell)));

System.out.println();

}

}

close();

 

6、修改数据

只要S001rowkey存在 ,且info:name的值存在,就是修改,否则为添加。

Table table = connection.getTable(TableName.valueOf("stud"));

Put put = new Put("S001".getBytes());

put.addColumn("info".getBytes(),"name".getBytes(), "Smith".getBytes());

table.put(put);

close();

修改完成以后,查询得到新的数据:

hbase(main):028:0> get "stud","S001","info:name"

COLUMN     CELL  

 info:name  timestamp=1529156559746, value=Smith          

1 row(s) in 0.0240 seconds

 

7、删除数据

1、删除某行中的某个列的值

hbase(main):040:0> delete "stud","S004","info:name"

0 row(s) in 0.0060 seconds

以下是Java API

Table table = connection.getTable(TableName.valueOf("stud"));

Delete delete = new Delete("S001".getBytes());

delete.addColumn("info".getBytes(),"age".getBytes());

table.delete(delete);

 

2、删除某个rowkey的所有记录,使用deleteall

以下是源数据:

hbase(main):051:0> get "stud","S001"

COLUMN       CELL  

 info:age    timestamp=1529157935077, value=55         

 info:name   timestamp=1529156559746, value=Smith        

 info:sex    timestamp=1529157943665, value=FEMALE       

3 row(s) in 0.0340 seconds

以下是使用命令行删除:

hbase(main):052:0> deleteall "stud","S001"

0 row(s) in 0.0140 seconds

以下是Java代码操作删除:

Table table = connection.getTable(TableName.valueOf("stud"));

Delete delete = new Delete("S001".getBytes());

table.delete(delete);

 通过上面的代码可知,如果不设置列族和列标识,则就是删除整个rowkey的记录。

8、删除表

必须要先将表禁用以后,才可以删除表。

hbase(main):059:0> disable "persons"

0 row(s) in 2.3400 seconds

hbase(main):060:0> drop "persons"

0 row(s) in 1.3060 seconds

Java代码的实现是:

hbaseadmin.disableTable("stud");

hbaseadmin.deleteTable("stud");


欢迎关注:


以上是关于HBase单节点下JavaAPI连接的主要内容,如果未能解决你的问题,请参考以下文章

HBase的单节点集群详细启动步骤(分为Zookeeper自带还是外装)

hbase单节点安装部署

HBase探索篇 _ 单节点多RegionServer部署与性能测试

hbase安装,以及安装前置hadoop(单节点)

2021-12-15 redis单节点使用连接异常

2021-12-15 redis单节点使用连接异常