一、Java API和HBase数据模型的关系
在Java中,与HBase数据库存储管理相关的类包括HBaseAdmin、HBaseConfiguration、HTable、HTableDescriptor、Put、Get以及Scanner,其中,与数据库相关的类包括HBaseAdmin和HBaseConfiguration,与表相关的包括HTable,操作列族的类是HTableDescriptor,列的修饰符包括Put、Get、Scanner三个类。
二、HBaseConfiguration类
通过HBaseConfiguration类可以对HBase进行相关配置,它是每一个HBase Client都会用到的对象,它的构造函数主要由以下两种:
1 public HBaseConfiguration();
2 public HBaseConfiguration(final Configuration c);
3 /*默认的构造方式会尝试从hbase-default.xml和hbase-site.xml中读取配置。如果classpath没有这两个文件,就需要你自己设置配置。*/
它常用的操作主要是像下面的语句这样:
1 HBaseConfiguration hconfig = new HBaseConfiguration();
2 hconfig.set("hbase.zookeeper.property.clientPort","8000");
这两条语句设置了“hbase.zookeeper.property.clientPort”属性的端口号为8000,一般情况下,HBaseConfiguration会使用构造函数进行初始化,然后再使用set、get方法添加必要的设置。
三、HBaseAdmin类
HBaseAdmin类主要是提供了一个接口来管理HBase数据库的表信息。它主要常用的一些表的操作方法,例如:创建表、删除表、浏览表、添加表或者删除表中数据,用法示例:
1 HBaseAdmin admin = new HBaseAdmin(hconfig);
2 hAdmin.createTable(“table name”);
3 hAdmin.disableTable("table name");
上面的语句首先创建一个表,然后使该表无效。在这个类的使用过程中,大多数还需要结合HTableDescriptor和HColumnDescriptor类,HTableDescriptor这个类主要是创建表的名字以及对应表的列族,HColumnDescriptor类主要是维护列族的信息,通常在创建表为表添加列族的时候使用,列族被创建之后不能直接修改,只能通过删除然后重建的方式修改,完整创建表的语句如下:
1 HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);
2 HTableDescriptor t = new HTableDescriptor(tableName);
3 t.addFamily(new HColumnDescriptor(“f1″));
4 t.addFamily(new HColumnDescriptor(“f2″));
5 t.addFamily(new HColumnDescriptor(“f3″));
6 t.addFamily(new HColumnDescriptor(“f4″));
7 hAdmin.createTable(t);
View Code
四、HTable类
HTable主要是与HBase表进行通信,但是此方法对于更新操作时非线程安全的,如果有多个线程与单个HTable实例进行通信,那么写缓冲区可能会崩溃,常用的操作主要是:
1 HTable ht = new HTable(config,Bytes.toBytes(tablename));
2 ResultScanner scanner = ht.getScanner(familyname);
五、Put类
Put类主要是获取单个行的信息,对单个行进行添加信息,同时结合Result类可以进行查询,方便的获取值或者各种(key-value)对,使用实例如下:
1 HTable ht = new HTable(config,Bytes.toBytes(tablename));
2 Put put = new Put(rowname);//为指定行创建一个Put操作
3 put.add(family,qualifier,value);
4 ht.put(put);
5 Get get = new Get(Byte.toBytes(rowname));
6 Result re = ht.get(get);
7 Bytes[] b = re.getValue((familyname+";"+columnname));
8 ResultScanner scanner = ht.getScanner(Bytes.toBytes(family));
9 for(Result var:scanner){
10 Bytes[] b = var.getValue(familyname,columnname);
11 }
View Code
完整代码:
1 import java.io.IOException;
2
3 import org.apache.hadoop.conf.Configuration;
4 import org.apache.hadoop.hbase.HBaseConfiguration;
5 import org.apache.hadoop.hbase.HColumnDescriptor;
6 import org.apache.hadoop.hbase.HTableDescriptor;
7 import org.apache.hadoop.hbase.KeyValue;
8 import org.apache.hadoop.hbase.client.Delete;
9 import org.apache.hadoop.hbase.client.Get;
10 import org.apache.hadoop.hbase.client.HBaseAdmin;
11 import org.apache.hadoop.hbase.client.HTable;
12 import org.apache.hadoop.hbase.client.HTablePool;
13 import org.apache.hadoop.hbase.client.Put;
14 import org.apache.hadoop.hbase.client.Result;
15 import org.apache.hadoop.hbase.client.ResultScanner;
16 import org.apache.hadoop.hbase.client.Scan;
17 import org.apache.hadoop.hbase.util.Bytes;
18
19 public class Hbase {
20 // 声明静态配置
21 static Configuration conf = null;
22 static {
23 conf = HBaseConfiguration.create();
24 conf.set("hbase.zookeeper.quorum", "localhost");
25 }
26
27 /*
28 * 创建表
29 *
30 * @tableName 表名
31 *
32 * @family 列族列表
33 */
34 public static void creatTable(String tableName, String[] family)
35 throws Exception {
36 HBaseAdmin admin = new HBaseAdmin(conf);
37 HTableDescriptor desc = new HTableDescriptor(tableName);
38 for (int i = 0; i < family.length; i++) {
39 desc.addFamily(new HColumnDescriptor(family[i]));
40 }
41 if (admin.tableExists(tableName)) {
42 System.out.println("table Exists!");
43 System.exit(0);
44 } else {
45 admin.createTable(desc);
46 System.out.println("create table Success!");
47 }
48 }
49
50 /*
51 * 为表添加数据(适合知道有多少列族的固定表)
52 *
53 * @rowKey rowKey
54 *
55 * @tableName 表名
56 *
57 * @column1 第一个列族列表
58 *
59 * @value1 第一个列的值的列表
60 *
61 * @column2 第二个列族列表
62 *
63 * @value2 第二个列的值的列表
64 */
65 public static void addData(String rowKey, String tableName,
66 String[] column1, String[] value1, String[] column2, String[] value2)
67 throws IOException {
68 Put put = new Put(Bytes.toBytes(rowKey));// 设置rowkey
69 HTable table = new HTable(conf, Bytes.toBytes(tableName));// HTabel负责跟记录相关的操作如增删改查等//
70 // 获取表
71 HColumnDescriptor[] columnFamilies = table.getTableDescriptor() // 获取所有的列族
72 .getColumnFamilies();
73
74 for (int i = 0; i < columnFamilies.length; i++) {
75 String familyName = columnFamilies[i].getNameAsString(); // 获取列族名
76 if (familyName.equals("article")) { // article列族put数据
77 for (int j = 0; j < column1.length; j++) {
78 put.add(Bytes.toBytes(familyName),
79 Bytes.toBytes(column1[j]), Bytes.toBytes(value1[j]));
80 }
81 }
82 if (familyName.equals("author")) { // author列族put数据
83 for (int j = 0; j < column2.length; j++) {
84 put.add(Bytes.toBytes(familyName),
85 Bytes.toBytes(column2[j]), Bytes.toBytes(value2[j]));
86 }
87 }
88 }
89 table.put(put);
90 System.out.println("add data Success!");
91 }
92
93 /*
94 * 根据rwokey查询
95 *
96 * @rowKey rowKey
97 *
98 * @tableName 表名
99 */
100 public static Result getResult(String tableName, String rowKey)
101 throws IOException {
102 Get get = new Get(Bytes.toBytes(rowKey));
103 HTable table = new HTable(conf, Bytes.toBytes(tableName));// 获取表
104 Result result = table.get(get);
105 for (KeyValue kv : result.list()) {
106 System.out.println("family:" + Bytes.toString(kv.getFamily()));
107 System.out
108 .println("qualifier:" + Bytes.toString(kv.getQualifier()));
109 System.out.println("value:" + Bytes.toString(kv.getValue()));
110 System.out.println("Timestamp:" + kv.getTimestamp());
111 System.out.println("-------------------------------------------");
112 }
113 return result;
114 }
115
116 /*
117 * 遍历查询hbase表
118 *
119 * @tableName 表名
120 */
121 public static void getResultScann(String tableName) throws IOException {
122 Scan scan = new Scan();
123 ResultScanner rs = null;
124 HTable table = new HTable(conf, Bytes.toBytes(tableName));
125 try {
126 rs = table.getScanner(scan);
127 for (Result r : rs) {
128 for (KeyValue kv : r.list()) {
129 System.out.println("row:" + Bytes.toString(kv.getRow()));
130 System.out.println("family:"
131 + Bytes.toString(kv.getFamily()));
132 System.out.println("qualifier:"
133 + Bytes.toString(kv.getQualifier()));
134 System.out
135 .println("value:" + Bytes.toString(kv.getValue()));
136 System.out.println("timestamp:" + kv.getTimestamp());
137 System.out
138 .println("-------------------------------------------");
139 }
140 }
141 } finally {
142 rs.close();
143 }
144 }
145
146 /*
147 * 遍历查询hbase表
148 *
149 * @tableName 表名
150 */
151 public static void getResultScann(String tableName, String start_rowkey,
152 String stop_rowkey) throws IOException {
153 Scan scan = new Scan();
154 scan.setStartRow(Bytes.toBytes(start_rowkey));
155 scan.setStopRow(Bytes.toBytes(stop_rowkey));
156 ResultScanner rs = null;
157 HTable table = new HTable(conf, Bytes.toBytes(tableName));
158 try {
159 rs = table.getScanner(scan);
160 for (Result r : rs) {
161 for (KeyValue kv : r.list()) {
162 System.out.println("row:" + Bytes.toString(kv.getRow()));
163 System.out.println("family:"
164 + Bytes.toString(kv.getFamily()));
165 System.out.println("qualifier:"
166 + Bytes.toString(kv.getQualifier()));
167 System.out
168 .println("value:" + Bytes.toString(kv.getValue()));
169 System.out.println("timestamp:" + kv.getTimestamp());
170 System.out
171 .println("-------------------------------------------");
172 }
173 }
174 } finally {
175 rs.close();
176 }
177 }
178
179 /*
180 * 查询表中的某一列
181 *
182 * @tableName 表名
183 *
184 * @rowKey rowKey
185 */
186 public static void getResultByColumn(String tableName, String rowKey,
187 String familyName, String columnName) throws IOException {
188 HTable table = new HTable(conf, Bytes.toBytes(tableName));
189 Get get = new Get(Bytes.toBytes(rowKey));
190 get.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName)); // 获取指定列族和列修饰符对应的列
191 Result result = table.get(get);
192 for (KeyValue kv : result.list()) {
193 System.out.println("family:" + Bytes.toString(kv.getFamily()));
194 System.out
195 .println("qualifier:" + Bytes.toString(kv.getQualifier()));
196 System.out.println("value:" + Bytes.toString(kv.getValue()));
197 System.out.println("Timestamp:" + kv.getTimestamp());
198 System.out.println("-------------------------------------------");
199 }
200 }
201
202 /*
203 * 更新表中的某一列
204 *
205 * @tableName 表名
206 *
207 * @rowKey rowKey
208 *
209 * @familyName 列族名
210 *
211 * @columnName 列名
212 *
213 * @value 更新后的值
214 */
215 public static void updateTable(String tableName, String rowKey,
216 String familyName, String columnName, String value)
217 throws IOException {
218 HTable table = new HTable(conf, Bytes.toBytes(tableName));
219 Put put = new Put(Bytes.toBytes(rowKey));
220 put.add(Bytes.toBytes(familyName), Bytes.toBytes(columnName),
221 Bytes.toBytes(value));
222 table.put(put);
223 System.out.println("update table Success!");
224 }
225
226 /*
227 * 查询某列数据的多个版本
228 *
229 * @tableName 表名
230 *
231 * @rowKey rowKey
232 *
233 * @familyName 列族名
234 *
235 * @columnName 列名
236 */
237 public static void getResultByVersion(String tableName, String rowKey,
238 String familyName, String columnName) throws IOException {
239 HTable table = new HTable(conf, Bytes.toBytes(tableName));
240 Get get = new Get(Bytes.toBytes(rowKey));
241 get.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));
242 get.setMaxVersions(5);
243 Result result = table.get(get);
244 for (KeyValue kv : result.list()) {
245 System.out.println("family:" + Bytes.toString(kv.getFamily()));
246 System.out
247 .println("qualifier:" + Bytes.toString(kv.getQualifier()));
248 System.out.println("value:" + Bytes.toString(kv.getValue()));
249 System.out.println("Timestamp:" + kv.getTimestamp());
250 System.out.println("-------------------------------------------");
251 }
252 /*
253 * List<?> results = table.get(get).list(); Iterator<?> it =
254 * results.iterator(); while (it.hasNext()) {
255 * System.out.println(it.next().toString()); }
256 */
257 }
258
259 /*
260 * 删除指定的列
261 *
262 * @tableName 表名
263 *
264 * @rowKey rowKey
265 *
266 * @familyName 列族名
267 *
268 * @columnName 列名
269 */
270 public static void deleteColumn(String tableName, String rowKey,
271 String falilyName, String columnName) throws IOException {
272 HTable table = new HTable(conf, Bytes.toBytes(tableName));
273 Delete deleteColumn = new Delete(Bytes.toBytes(rowKey));
274 deleteColumn.deleteColumns(Bytes.toBytes(falilyName),
275 Bytes.toBytes(columnName));
276 table.delete(deleteColumn);
277 System.out.println(falilyName + ":" + columnName + "is deleted!");
278 }
279
280 /*
281 * 删除指定的列
282 *
283 * @tableName 表名
284 *
285 * @rowKey rowKey
286 */
287 public static void deleteAllColumn(String tableName, String rowKey)
288 throws IOException {
289 HTable table = new HTable(conf, Bytes.toBytes(tableName));
290 Delete deleteAll = new Delete(Bytes.toBytes(rowKey));
291 table.delete(deleteAll);
292 System.out.println("all columns are deleted!");
293 }
294
295 /*
296 * 删除表
297 *
298 * @tableName 表名
299 */
300 public static void deleteTable(String tableName) throws IOException {
301 HBaseAdmin admin = new HBaseAdmin(conf);
302 admin.disableTable(tableName);
303 admin.deleteTable(tableName);
304 System.out.println(tableName + "is deleted!");
305 }
306
307 public static void main(String[] args) throws Exception {
308
309 // 创建表
310 String tableName = "blog2";
311 String[] family = { "article", "author" };
312 // creatTable(tableName, family);
313
314 // 为表添加数据
315
316 String[] column1 = { "title", "content", "tag" };
317 String[] value1 = {
318 "Head First HBase",
319 "HBase is the Hadoop database. Use it when you need random, realtime read/write access to your Big Data.",
320 "Hadoop,HBase,NoSQL" };
321 String[] column2 = { "name", "nickname" };
322 String[] value2 = { "nicholas", "lee" };
323 addData("rowkey1", "blog2", column1, value1, column2, value2);
324 addData("rowkey2", "blog2", column1, value1, column2, value2);
325 addData("rowkey3", "blog2", column1, value1, column2, value2);
326
327 // 遍历查询
328 getResultScann("blog2", "rowkey4", "rowkey5");
329 // 根据row key范围遍历查询
330 getResultScann("blog2", "rowkey4", "rowkey5");
331
332 // 查询
333 getResult("blog2", "rowkey1");
334
335 // 查询某一列的值
336 getResultByColumn("blog2", "rowkey1", "author", "name");
337
338 // 更新列
339 updateTable("blog2", "rowkey1", "author", "name", "bin");
340
341 // 查询某一列的值
342 getResultByColumn("blog2", "rowkey1", "author", "name");
343
344 // 查询某列的多版本
345 getResultByVersion("blog2", "rowkey1", "author", "name");
346
347 // 删除一列
348 deleteColumn("blog2", "rowkey1", "author", "nickname");
349
350 // 删除所有列
351 deleteAllColumn("blog2", "rowkey1");
352
353 // 删除表
354 deleteTable("blog2");
355
356 }
357 }
View Code