1.文章目的
本文主要包括两个方面的内容,一是Hbase Java API简介;二是一个完整的Java项目访问Hbase的步骤及示例代码。
本文档假设读者已在VMware上安装centOS虚拟机,并且已成功安装配置好Hadoop伪集群或者集群和Hbase数据库
2.Hbase的javaAPI简介
2.1几个相关类与HBase数据模型之间的对应关系
3.重点类介绍
3.1.HBaseConfiguration
关系:org.apache.hadoop.hbase.HBaseConfiguration
作用:对HBase进行配置
用法示例:
1.HBaseConfiguration hconfig = new HBaseConfiguration();
2.hconfig.set("hbase.zookeeper.property.clientPort","2181");
该方法设置了"hbase.zookeeper.property.clientPort"的端口号为2181。一般情况下,HBaseConfiguration会使用构造函数进行初始化,然后在使用其他方法。
3.2.HBaseAdmin
关系:org.apache.hadoop.hbase.client.HBaseAdmin
作用:提供了一个接口来管理HBase数据库的表信息。它提供的方法包括:创建表,删除表,列出表项,使表有效或无效,以及添加或删除表列族成员等。
用法示例:
1.HBaseAdmin admin = new HBaseAdmin(config);
2.admin.disableTable("tablename")
3.3.HTableDescriptor
关系:org.apache.hadoop.hbase.HTableDescriptor
作用:包含了表的名字极其对应表的列族
用法示例:
1.HTableDescriptor htd = new HTableDescriptor(table);
2.htd.addFamily(new HcolumnDescriptor("family"));
在上述例子中,通过一个HColumnDescriptor实例,为HTableDescriptor添加了一个列族:family
3.4.HColumnDescriptor
关系:org.apache.hadoop.hbase.HColumnDescriptor
作用:维护着关于列族的信息,例如版本号,压缩设置等。它通常在创建表或者为表添加列族的时候使用。列族被创建后不能直接修改,只能通过删除然后重新创建的方式。列族被删除的时候,列族里面的数据也会同时被删除。
用法示例:
1.HTableDescriptor htd = new HTableDescriptor(tablename);
2.HColumnDescriptor col = new HColumnDescriptor("content:");
3.htd.addFamily(col);
此例添加了一个content的列族
3.5.HTable
关系:org.apache.hadoop.hbase.client.HTable
作用:可以用来和HBase表直接通信。此方法对于更新操作来说是非线程安全的。
用法示例:
1.HTable table = new HTable(conf, Bytes.toBytes(tablename));
2.ResultScanner scanner = table.getScanner(family);
3.6.Put
关系:org.apache.hadoop.hbase.client.Put
作用:用来对单个行执行添加操作
用法示例:
1.HTable table = new HTable(conf,Bytes.toBytes(tablename));
2.Put p = new Put(brow);//为指定行创建一个Put操作
3.p.add(family,qualifier,value);
4.table.put(p);
3.7.Get
关系:org.apache.hadoop.hbase.client.Get
作用:用来获取单个行的相关信息
用法示例:
1.HTable table = new HTable(conf, Bytes.toBytes(tablename));
2.Get g = new Get(Bytes.toBytes(row));
3.8.Result
关系:org.apache.hadoop.hbase.client.Result
作用:存储Get或者Scan操作后获取表的单行值。使用此类提供的方法可以直接获取值或者各种Map结构(key-value对)
3.9.ResultScanner
关系:Interface
作用:客户端获取值的接口
4.Java API访问HBase操作步骤
4.1.新建一个Java project
4.2.导入jar包
全部来源于官方文档(hbase-1.0.0-cdh5.4.8.tar.gz)解压后,xx\hbase-1.0.0-cdh5.4.8\lib*.jar
4.3.新建一个class文件
4.4.声明静态配置
示例代码:
// 声明静态配置
//与HBase数据库连接的对象
static Configuration conf = null;
//与HBase数据库连接的对象
static Connection connection;
static Admin admin;
static {
//取得一个数据库连接的配置参数对象
conf = HBaseConfiguration.create();
//设置连接参数:HBase数据库所在的主机IP或者主机名
conf.set("hbase.zookeeper.quorum", "192.168.1.33");
// conf.set("hbase.zookeeper.quorum", "hbase");
//设置连接参数:HBase数据库使用的端口(也可以不配置)
conf.set("hbase.zookeeper.property.clientPort", "2181");
try {
//取得一个数据库连接对象
connection = ConnectionFactory.createConnection(conf);
//取得一个数据库元数据操作对象
admin = connection.getAdmin();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
4.5.创建表
示例代码:
public static void creatTable() throws Exception {
//数据库表名
String tableNameString = "table2";
//新建一个数据库表名对象
TableName tableName = TableName.valueOf(tableNameString);
//如果需要新建的表已存在
if (admin.tableExists(tableName)) {
System.out.println("table Exists!");
System.exit(0);
//如果新建的表不存在
} else {
//数据表描述对象
HTableDescriptor desc = new HTableDescriptor(tableName);
//列族描述对象
HColumnDescriptor family = new HColumnDescriptor("base");
//在数据库表中新建一个列族
desc.addFamily(family);
//新建数据表
admin.createTable(desc);
System.out.println("create table Success!");
}
}
代码执行结果示例:
4.6.插入数据
示例代码:
public static void addData() throws IOException {
//取得一个数据表对象
Table table = connection.getTable(TableName.valueOf("table2"));
//需要插入数据库的数据集合
List<Put> putList = new ArrayList<Put>();
Put put;
//生成数据集合
for(int i = 0;i < 10;i++) {
//插入数据的rowkey
put = new Put(Bytes.toBytes("row" + i));
//三个参数分别是列族名base,列名name,值NikeName+i
put.addColumn(Bytes.toBytes("base"), Bytes.toBytes("name"),
Bytes.toBytes("nikeName" + i));
putList.add(put);
}
//将数据集合插入数据库
table.put(putList);
System.out.println("add data Success!");
}
代码执行结果示例:
4.7.查询整表数据
示例代码:
public static void getResultScan() throws IOException {
//取得一个数据表对象
Table table = connection.getTable(TableName.valueOf("table2"));
//取得表中所有数据
ResultScanner scanner = table.getScanner(new Scan());
//循环输出表中的数据
for (Result r : scanner) {
byte[] row = r.getRow();
System.out.println("row key is :" + Bytes.toString(row));
List<Cell> listCells = r.listCells();
for(Cell cell : listCells) {
byte[] familyArray = cell.getFamily();
byte[] qualifierArray = cell.getQualifier();
byte[] valueArray = cell.getValue();
System.out.println("row value is :" + Bytes.toString(familyArray) + " "
+ Bytes.toString(qualifierArray) + " " + Bytes.toString(valueArray));
}
}
}
代码执行结果示例:
4.8.按行健查询表数据
示例代码:
public static void getResultByRowKey() throws IOException {
//取得一个数据表对象
Table table = connection.getTable(TableName.valueOf("table2"));
//新建一个查询对象作为查询条件
Get get = new Get(Bytes.toBytes("row5"));
//按行健查询数据
Result r = table.get(get);
byte[] row = r.getRow();
System.out.println("row key is :" + Bytes.toString(row));
List<Cell> listCells = r.listCells();
for(Cell cell : listCells) {
byte[] familyArray = cell.getFamily();
byte[] qualifierArray = cell.getQualifier();
byte[] valueArray = cell.getValue();
System.out.println("row value is :" + Bytes.toString(familyArray) + " "
+ Bytes.toString(qualifierArray) + " " + Bytes.toString(valueArray));
}
}
代码执行结果示例:
4.9.删除行
示例代码:
public static void deleteByRowKey() throws IOException {
//取得待操作数据表对象
Table table = connection.getTable(TableName.valueOf("table2"));
//创建删除条件对象
Delete delete = new Delete(Bytes.toBytes("row3"));
//执行删除操作
table.delete(delete);
}
代码执行结果示例:
4.10.清空表
示例代码:
public static void truncateTable() throws IOException {
//取得待操作数据表的表名对象
TableName tableName =TableName.valueOf("table2");
//设置表状态为无效
admin.disableTable(tableName);
//清空表的数据
admin.truncateTable(tableName, true);
}
代码执行结果示例:
4.11.删除表
示例代码:
public static void deleteTable() throws IOException {
//取得待操作数据表的表名对象
TableName tableName =TableName.valueOf("table2");
//设置表状态为无效
admin.disableTable(tableName);
//删除表
admin.deleteTable(tableName);
}
}
代码执行结果示例: