HBase单节点下JavaAPI连接
Posted 健哥说编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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/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依赖:
Hbase、zookeeper和hadoop。且hadoop的版本为2.5。
步2、JavaAPI显示所有表名
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上运行
在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
[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、所有操作都基于先创建一个Connection和HBaseAdmin对象。
2、使用Java代码操作HBase,连接的对象为zookeeper的2181端口。
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、修改数据
只要S001的rowkey存在 ,且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自带还是外装)