HBase单节点下JavaAPI连接

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

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

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

[wangjian@hadoop91 ~]$ jps

2388 Main

2503 Jps

1934 HMaster

通过上面的结果,可知,HMaster进程所占用的id为1934。

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/javatcp6 0 0 ::1:56710 ::1:2181 ESTABLISHED 1934/java

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

连接hbase就是连接zookeeper的过程。只要连接上hbase,就可以连接成功hbase。所以,只要在Configuration配置对象中,指定zookeeper的地址或是zookeeper的集群地址就可以操作hbase了。以下是在windows上开发的代码,此代码用于查询出hbase中的所有表:

步1、添加hbase的依赖

hbase-client

1.2.6.1

查看整个依赖树的关系:

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

Hbase、zookeeper和hadoop。且hadoop的版本为2.5。

步2、JavaAPI显示所有表名

/**

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

*@authorwangjian

*@version1.0 2018年6月15日

*/

publicclassDemo01_Conn {

publicstaticvoidmain(String[]args)throwsException {

Configurationconfig= HBaseConfiguration.create();

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

Connectioncon= ConnectionFactory.createConnection(config);

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

Adminadmin=con.getAdmin();

TableName[]tns=admin.listTableNames();

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

//这儿将所有表名

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

}

con.close();

}

}

运行显示的结果:

Conn is:hconnection-0x3dfc5fb8

Stud

步3、打包以后在Linux上运行

在Eclipse的maven项目中,使用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

输出结果:

Conn is:hconnection-0x101df177

Stud

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

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

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

步4、更多操作

说明:

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

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

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

Configurationconfig= HBaseConfiguration.create();

Connectioncon= ConnectionFactory.createConnection(config);

Adminadmin=con.getAdmin();

1、创建一个表

/**

* 创建一个HBase表的测试

*@authorwangjian

*@version1.0 2018年6月15日

*/

publicclassDemo02_Create {

publicstaticvoidmain(String[]args)throwsException {

Configurationconfig= HBaseConfiguration.create();

Connectioncon= ConnectionFactory.createConnection(config);

Adminadmin=con.getAdmin();

HBaseAdminha= (HBaseAdmin)admin;

//声明表

HTableDescriptortable=newHTableDescriptor(TableName.valueOf("persons"));

table.addFamily(newHColumnDescriptor("info"));

ha.createTable(table);

con.close();

}

}

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

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

Table persons is ENABLED

persons

COLUMN FAMILIES DESCRIPTION

1 row(s) in 0.1790 seconds

2、查询所有表

TableName[]tns=admin.listTableNames();

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

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

}

3、向表中写入记录

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

Putput=newPut("S001".getBytes());//构造参数为rowkey

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

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

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

4、批量向表中写入记录

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

List

list=newArrayList

();

for(inti= 0;i

Putput=newPut(("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代码对数据进行遍历:

Tabletable=connection.getTable(TableName.valueOf("stud"));

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

for(Resultresult:rs) {

StringrowKey= Bytes.toString(result.getRow());

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

while(cellScanner.advance()) {

Cellcell=cellScanner.current();

}

}

close();

6、修改数据

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

Tabletable=connection.getTable(TableName.valueOf("stud"));

Putput=newPut("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:

Tabletable=connection.getTable(TableName.valueOf("stud"));

Deletedelete=newDelete("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代码操作删除:

Tabletable=connection.getTable(TableName.valueOf("stud"));

Deletedelete=newDelete("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");

欢迎关注:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180617G0BW5G00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券