摘要:在前文中安装了Hbase,通过Hbase shell可以进行一些操作,但是和实际的编程实例联系起来不方便,因此本文介绍有关Hbase编程的实例。
一、使用Eclipse开发HBase应用程序
1,在Eclipse中新建一个Java Project,命名为HBaseTest,然后右键Properties中选择Java Build Path,选择Add External Jars,将HBase/lib目录下的jar包导入进来。
2,在工程根目录下创建Conf文件夹,将HBase/Conf下的hbase-site.xml文件复制到该文件夹中,通过右键选择Properties->Java BuildPath->Libraries->Add Class Folder,然后选择Conf文件夹即可。
二、简要介绍HBaseJava API
1, HbaseConfiguration
关系:org.apache.hadoop.hbase.HBaseConfiguration
作用:通过此类可以对HBase进行配置
2, HBaseAdmin
关系:org.apache.hadoop.hbase.client.HBaseAdmin
作用:提供一个接口来管理HBase数据库中的表信息。它提供创建表、删除表等方法。
3, HTableDescriptor
关系:org.apache.hadoop.hbase.client.HTableDescriptor
作用:包含了表的名字及其对应列族。 提供的方法有
void addFamily(HColumnDescriptor) 添加一个列族
HColumnDescriptor removeFamily(byte[] column) 移除一个列族
byte[] getName() 获取表的名字
byte[] getValue(byte[] key) 获取属性的值
void setValue(String key,Stringvalue) 设置属性的值
4, HColumnDescriptor
关系:org.apache.hadoop.hbase.client.HColumnDescriptor
作用:维护关于列的信息。提供的方法有
byte[] getName() 获取列族的名字
byte[] getValue() 获取对应的属性的值
void setValue(String key,String value)设置对应属性的值
5, HTable
关系:org.apache.hadoop.hbase.client.HTable
作用:用户与HBase表进行通信。此方法对于更新操作来说是非线程安全的,如果启动多个线程尝试与单个HTable实例进行通信,那么写缓冲器可能会崩溃。
6, Put
关系:org.apache.hadoop.hbase.client.Put
作用:用于对单个行执行添加操作
7, Get
关系:org.apache.hadoop.hbase.client.Get
作用:用于获取单个行的相关信息
8, Result
关系:org.apache.hadoop.hbase.client.Result
作用:存储Get或Scan操作后获取的单行值。
9, ResultScanner
关系:Interface
作用:客户端获取值的接口。
三、 HBase Java API简单实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
import
java.io.IOException;
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.HBaseAdmin;
import
org.apache.hadoop.hbase.client.HTable;
import
org.apache.hadoop.hbase.client.Put;
import
org.apache.hadoop.hbase.client.Get;
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;
/*
* @author minglaihan
*/
public
class
HBaseTest {
static
Configuration cfg = HBaseConfiguration.create();
//通过HBaseAdmin HTableDescriptor来创建一个新表
public
static
void
create(String tableName, String columnFamily)
throws
Exception{
HBaseAdmin admin =
new
HBaseAdmin(cfg);
if
(admin.tableExists(tableName)){
System.out.println(
"Table exist"
);
System.exit(
0
);
}
else
{
HTableDescriptor tableDescriptor =
new
HTableDescriptor(tableName);
tableDescriptor.addFamily(
new
HColumnDescriptor(columnFamily));
admin.createTable(tableDescriptor);
System.out.println(
"Table create success"
);
}
}
//添加一条数据,通过HTable Put为已存在的表添加数据
public
static
void
put(String tableName,String row,String columnFamily,String column,String data)
throws
IOException{
HTable table =
new
HTable(cfg, tableName);
Put put =
new
Put(Bytes.toBytes(row));
put.add(Bytes.toBytes(columnFamily),Bytes.toBytes(column),Bytes.toBytes(data));
table.put(put);
System.out.println(
"put success"
);
}
//获取tableName表里列为row的结果集
public
static
void
get(String tableName,String row)
throws
IOException{
HTable table =
new
HTable(cfg, tableName);
Get get =
new
Get(Bytes.toBytes(row));
Result result = table.get(get);
System.out.println(
"get "
+ result);
}
//通过HTable Scan来获取tableName表的所有数据信息
public
static
void
scan (String tableName)
throws
IOException{
HTable table =
new
HTable(cfg, tableName);
Scan scan =
new
Scan();
ResultScanner resultScanner = table.getScanner(scan);
for
(Result s:resultScanner){
System.out.println(
"Scan "
+ resultScanner);
}
}
public
static
boolean
delete(String tableName)
throws
Exception{
HBaseAdmin admin =
new
HBaseAdmin(cfg);
if
(admin.tableExists(tableName)){
try
{
admin.disableTable(tableName);
admin.deleteTable(tableName);
}
catch
(Exception e) {
// TODO: handle exception
e.printStackTrace();
return
false
;
}
}
return
true
;
}
public
static
void
main(String[] args) {
String tableName =
"hbase_test"
;
String columnFamily =
"c1"
;
try
{
HBaseTest.create(tableName, columnFamily);
HBaseTest.put(tableName,
"row1"
, columnFamily,
"column1"
,
"data1"
);
HBaseTest.get(tableName,
"row1"
);
HBaseTest.scan(tableName);
if
(HBaseTest.delete(tableName)==
true
){
System.out.println(
"delete table "
+ tableName+
"success"
);
}
}
catch
(Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
|
将Delete的步骤注释掉的运行结果截图:
四、总结
HBase与Java API的交互目前表现良好,在今后的hadoop编程中,可以根据HBase的情况适当利用,提高整体水平。