HBase提供了java api来对HBase进行一系列的管理涉及到对表的管理、数据的操作等。常用的API操作有:
1、 对表的创建、删除、显示以及修改等,可以用HBaseAdmin,一旦创建了表,那么可以通过HTable的实例来访问表,每次可以往表里增加数据。
2、 插入数据
创建一个Put对象,在这个Put对象里可以指定要给哪个列增加数据,以及当前的时间戳等值,然后通过调用HTable.put(Put)来提交操作,子猴在这里提请注意的是:在创建Put对象的时候,你必须指定一个行(Row)值,在构造Put对象的时候作为参数传入。
3、 获取数据
要获取数据,使用Get对象,Get对象同Put对象一样有好几个构造函数,通常在构造的时候传入行值,表示取第几行的数据,通过HTable.get(Get)来调用。
4、 浏览每一行
通过Scan可以对表中的行进行浏览,得到每一行的信息,比如列名,时间戳等,Scan相当于一个游标,通过next()来浏览下一个,通过调用HTable.getScanner(Scan)来返回一个ResultScanner对象。HTable.get(Get)和HTable.getScanner(Scan)都是返回一个Result。Result是一个
KeyValue的链表。
5、 删除
使用Delete来删除记录,通过调用HTable.delete(Delete)来执行删除操作。(注:删除这里有些特别,也就是删除并不是马上将数据从表中删除。)
6、 锁
新增、获取、删除在操作过程中会对所操作的行加一个锁,而浏览却不会。
7、 簇的访问
客户端代码通过ZooKeeper来访问找到簇,也就是说ZooKeeper quorum将被使用,那么相关的类(包)应该在客户端的类(classes)目录下,即客户端一定要找到文件hbase-site.xml。
以下是一个完整的代码示例,基于hbase-0.90.3编写(hbase的基本概念可参考我博客的前一篇文章):
import
java.io.IOException;
import
java.util.ArrayList;
import
java.util.List;
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.KeyValue;
import
org.apache.hadoop.hbase.MasterNotRunningException;
import
org.apache.hadoop.hbase.ZooKeeperConnectionException;
import
org.apache.hadoop.hbase.client.Delete;
import
org.apache.hadoop.hbase.client.Get;
import
org.apache.hadoop.hbase.client.HBaseAdmin;
import
org.apache.hadoop.hbase.client.HTable;
import
org.apache.hadoop.hbase.client.Result;
import
org.apache.hadoop.hbase.client.ResultScanner;
import
org.apache.hadoop.hbase.client.Scan;
import
org.apache.hadoop.hbase.client.Put;
import
org.apache.hadoop.hbase.util.Bytes;
public
class
HBaseTest {
private
static
Configuration conf =
null
;
/**
* 初始化配置
*/
static
{
Configuration HBASE_CONFIG =
new
Configuration();
//与hbase/conf/hbase-site.xml中hbase.zookeeper.quorum配置的值相同
HBASE_CONFIG.set(
"hbase.zookeeper.quorum"
,
"10.1.1.1"
);
//与hbase/conf/hbase-site.xml中hbase.zookeeper.property.clientPort配置的值相同
HBASE_CONFIG.set(
"hbase.zookeeper.property.clientPort"
,
"2181"
);
conf = HBaseConfiguration.create(HBASE_CONFIG);
}
/**
* 创建一张表
*/
public
static
void
creatTable(String tableName, String[] familys)
throws
Exception {
HBaseAdmin admin =
new
HBaseAdmin(conf);
if
(admin.tableExists(tableName)) {
System.out.println(
"table already exists!"
);
}
else
{
HTableDescriptor tableDesc =
new
HTableDescriptor(tableName);
for
(
int
i=
0
; i
tableDesc.addFamily(
new
HColumnDescriptor(familys[i]));
}
admin.createTable(tableDesc);
System.out.println(
"create table "
+ tableName +
" ok."
);
}
}
/**
* 删除表
*/
public
static
void
deleteTable(String tableName)
throws
Exception {
try
{
HBaseAdmin admin =
new
HBaseAdmin(conf);
admin.disableTable(tableName);
admin.deleteTable(tableName);
System.out.println(
"delete table "
+ tableName +
" ok."
);
}
catch
(MasterNotRunningException e) {
e.printStackTrace();
}
catch
(ZooKeeperConnectionException e) {
e.printStackTrace();
}
}
/**
* 插入一行记录
*/
public
static
void
addRecord (String tableName, String rowKey, String family, String qualifier, String value)
throws
Exception{
try
{
HTable table =
new
HTable(conf, tableName);
Put put =
new
Put(Bytes.toBytes(rowKey));
put.add(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
table.put(put);
System.out.println(
"insert recored "
+ rowKey +
" to table "
+ tableName +
" ok."
);
}
catch
(IOException e) {
e.printStackTrace();
}
}
/**
* 删除一行记录
*/
public
static
void
delRecord (String tableName, String rowKey)
throws
IOException{
HTable table =
new
HTable(conf, tableName);
List list =
new
ArrayList();
Delete del =
new
Delete(rowKey.getBytes());
list.add(del);
table.delete(list);
System.out.println(
"del recored "
+ rowKey +
" ok."
);
}
/**
* 查找一行记录
*/
public
static
void
getOneRecord (String tableName, String rowKey)
throws
IOException{
HTable table =
new
HTable(conf, tableName);
Get get =
new
Get(rowKey.getBytes());
Result rs = table.get(get);
for
(KeyValue kv : rs.raw()){
System.out.print(
new
String(kv.getRow()) +
" "
);
System.out.print(
new
String(kv.getFamily()) +
":"
);
System.out.print(
new
String(kv.getQualifier()) +
" "
);
System.out.print(kv.getTimestamp() +
" "
);
System.out.println(
new
String(kv.getValue()));
}
}
/**
* 显示所有数据
*/
public
static
void
getAllRecord (String tableName) {
try
{
HTable table =
new
HTable(conf, tableName);
Scan s =
new
Scan();
ResultScanner ss = table.getScanner(s);
for
(Result r:ss){
for
(KeyValue kv : r.raw()){
System.out.print(
new
String(kv.getRow()) +
" "
);
System.out.print(
new
String(kv.getFamily()) +
":"
);
System.out.print(
new
String(kv.getQualifier()) +
" "
);
System.out.print(kv.getTimestamp() +
" "
);
System.out.println(
new
String(kv.getValue()));
}
}
}
catch
(IOException e){
e.printStackTrace();
}
}
public
static
void
main (String [] agrs) {
try
{
String tablename =
"scores"
;
String[] familys = {
"grade"
,
"course"
};
HBaseTest.creatTable(tablename, familys);
//add record zkb
HBaseTest.addRecord(tablename,
"zkb"
,
"grade"
,
""
,
"5"
);
HBaseTest.addRecord(tablename,
"zkb"
,
"course"
,
""
,
"90"
);
HBaseTest.addRecord(tablename,
"zkb"
,
"course"
,
"math"
,
"97"
);
HBaseTest.addRecord(tablename,
"zkb"
,
"course"
,
"art"
,
"87"
);
//add record baoniu
HBaseTest.addRecord(tablename,
"baoniu"
,
"grade"
,
""
,
"4"
);
HBaseTest.addRecord(tablename,
"baoniu"
,
"course"
,
"math"
,
"89"
);
System.out.println(
"===========get one record========"
);
HBaseTest.getOneRecord(tablename,
"zkb"
);
System.out.println(
"===========show all record========"
);
HBaseTest.getAllRecord(tablename);
System.out.println(
"===========del one record========"
);
HBaseTest.delRecord(tablename,
"baoniu"
);
HBaseTest.getAllRecord(tablename);
System.out.println(
"===========show all record========"
);
HBaseTest.getAllRecord(tablename);
}
catch
(Exception e) {
e.printStackTrace();
}
}
}
|
程序编译为一个jar包hbtest.jar,执行脚本:
#!/bin/sh
source ~/.bash_profile
export HADOOP_CLASSPATH=/home/admin/hadoop/hadoop-core-
0.20
.
2
-CDH3B4.jar:/home/admin/hbase/hbase-
0.90
.
3
.jar:/home/admin/zookeeper/zookeeper-
3.3
.
2
.jar
hadoop jar hbtest.jar
|
输出结果是:
create table scores ok.
11
/
09
/
16
00
:
45
:
39
INFO zookeeper.ZooKeeper: Initiating client connection, connectString=
10.1
.
1.1
:
2181
sessionTimeout=
180000
watcher=hconnection
11
/
09
/
16
00
:
45
:
39
INFO zookeeper.ClientCnxn: Opening socket connection to server /
10.1
.
1.1
:
2181
11
/
09
/
16
00
:
45
:
39
INFO zookeeper.ClientCnxn: Socket connection established to search041134.sqa.cm4.tbsite.net/
10.1
.
1.1
:
2181
, initiating session
11
/
09
/
16
00
:
45
:
39
INFO zookeeper.ClientCnxn: Session establishment complete on server search041134.sqa.cm4.tbsite.net/
10.1
.
1.1
:
2181
, sessionid =
0x132614b5411007f
, negotiated timeout =
180000
insert recored zkb to table scores ok.
insert recored zkb to table scores ok.
insert recored zkb to table scores ok.
insert recored zkb to table scores ok.
insert recored baoniu to table scores ok.
insert recored baoniu to table scores ok.
===========get one record========
zkb course:
1316105139153
90
zkb course:art
1316105139156
87
zkb course:math
1316105139154
97
zkb grade:
1316105139149
5
===========show all record========
baoniu course:math
1316105139159
89
baoniu grade:
1316105139158
4
zkb course:
1316105139153
90
zkb course:art
1316105139156
87
zkb course:math
1316105139154
97
zkb grade:
1316105139149
5
===========del one record========
del recored baoniu ok.
zkb course:
1316105139153
90
zkb course:art
1316105139156
87
zkb course:math
1316105139154
97
zkb grade:
1316105139149
5
===========show all record========
zkb course:
1316105139153
90
zkb course:art
1316105139156
87
zkb course:math
1316105139154
97
zkb grade:
1316105139149
5
|
参考文献:
HBase Java客户端编程
HBase client API Guide(推荐,对hbase client API的说明比较详细)
另外一个例子:
package gucas.xiaoxia; import java.io.IOException; import java.nio.charset.Charset; 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.client.Get; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; public class MyClient { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub //read config-file hbase-site.xml, hbase-default.xml Configuration conf = HBaseConfiguration.create(); //create table client Admin HBaseAdmin admin = new HBaseAdmin(conf); HColumnDescriptor[] columns = new HColumnDescriptor[2]; columns[0] = new HColumnDescriptor("books"); columns[1] = new HColumnDescriptor("catalogs"); HTableDescriptor htd = new HTableDescriptor("mytable"); htd.addFamily(columns[0]); htd.addFamily(columns[1]); //create table mytable admin.createTable(htd); //Run some operations HTable table = new HTable(conf, htd.getNameAsString()); //Put opt Put p1 = new Put(Bytes.toBytes("row1")); //Byte p1.add(byte[] column family, byte[] qualifier, byte[] value) p1.add( Bytes.toBytes("books"), Bytes.toBytes("name"), Bytes.toBytes("west jury")); table.put(p1); p1 = new Put(Bytes.toBytes("row2")); p1.add( Bytes.toBytes("books"), Bytes.toBytes("author"), Bytes.toBytes("xiaoxia")); table.put(p1); p1 = new Put(Bytes.toBytes("row2")); p1.add( Bytes.toBytes("catalogs"), Bytes.toBytes("name"), Bytes.toBytes("xiaoxia-catalogs")); table.put(p1); //edit row2 books:author value p1 = new Put(Bytes.toBytes("row2")); p1.add( Bytes.toBytes("books"), Bytes.toBytes("author"), Bytes.toBytes("xiaoxia-books")); table.put(p1); Scan scan = new Scan(); ResultScanner scanner = table.getScanner(scan); for (Result result2 : scanner) { System.out.println("Scan : "+ result2); } scanner.close(); //get field value Get get = new Get("row1".getBytes()); Result result = table.get(get); System.out.println("get : "+ new String(result.getRow(),Charset.defaultCharset())+", "+new String(result.getValue("books".getBytes(), "name".getBytes()))); System.in.read(); //disable table first ,then delete the table System.out.println("disable table "); admin.disableTable("mytable".getBytes()); System.out.println("delete table "); admin.deleteTable("mytable".getBytes()); } }