使用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");
欢迎关注:
领取专属 10元无门槛券
私享最新 技术干货