├── .gitignore
├── README.md
├── pom.xml
└── src
└── main
├── java
└── org
│ └── caesar
│ └── hbase
│ ├── accessor
│ ├── HbaseAccessorImpl.java
│ └── IAccessor.java
│ ├── annotation
│ ├── HbaseDocument.java
│ ├── HbaseField.java
│ └── HbaseRowKey.java
│ ├── example
│ ├── TestAccessor.java
│ └── UserModel.java
│ └── util
│ ├── CommonUtil.java
│ ├── Constant.java
│ ├── HBasesUtil.java
│ └── HbaseAnnontationUtil.java
├── lib
└── utils-1.0-SNAPSHOT.jar
└── resources
├── hbase-site.xml
└── logback.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | *.class
2 | *.iml
3 | .idea
4 | .svn
5 | .git
6 | .classpath
7 | .project
8 | .settings
9 | target
10 | build
11 | logs
12 | log
13 | *.log*
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # enhanceHbase ( Java版,增强型Hbase API)
2 | ##特点:
3 | * 基于Java,封装了hbase的底层api,提供了基于注解的ORM支持,只需定义实体类对象,即可完成对hbase的各种操作。同时对List、Set、Map等复杂数据类型提供了支持。
4 |
5 | ##使用说明:
6 | * 1.下载
7 | * 2.修改配置文件参考:
8 | * (1).resources/hbase-site.xml:
9 | ```Java
10 |
11 |
12 |
13 |
14 | hbase.zookeeper.quorum
15 |
16 | namenode1,namenode2,datanode1,datanode2,datanode3
17 |
18 |
19 | ```
20 | * 3.定义实体类,参考如下:
21 | ```Java
22 | //定义表名和列簇名(目前只支持单个表对应一个列簇)
23 | @HbaseDocument(table = "my-table-user",family = "col_0")
24 | public class UserModel {
25 | @HbaseRowKey
26 | @HbaseField
27 | private Long userId;
28 | @HbaseField
29 | private String userName;
30 | @HbaseField
31 | private Integer age;
32 | @HbaseField
33 | private Map scoresMap;
34 | @HbaseField
35 | private List hobiesList;
36 | @HbaseField
37 | private Double schooling;
38 | @HbaseField
39 | private Set years;
40 | @HbaseField
41 | private Boolean end;
42 |
43 | getter and setter(省略)
44 | ```
45 | * 4.访问hbase:
46 | ```Java
47 | //获得访问hbase的accessor对象
48 | IAccessor accessor = new HbaseAccessorImpl();
49 | //删除表
50 | accessor.deleteTable(UserModel.class);
51 | //创建表
52 | accessor.createTable(UserModel.class);
53 | //判断表是否存在
54 | System.out.println(accessor.hasTable(UserModel.class));
55 | //new实体类并设置相关属性
56 | UserModel user = new UserModel();
57 | user.setUserId(1010001L);
58 | user.setUserName("caesar.zhu");
59 | user.setAge(30);
60 | Map scoresMap = new HashMap();
61 | scoresMap.put("history",95);
62 | scoresMap.put("geography",98);
63 | scoresMap.put("math",100);
64 | user.setScoresMap(scoresMap);
65 | List hobiesList = new ArrayList<>();
66 | hobiesList.add("basketball");
67 | hobiesList.add("swimming");
68 | hobiesList.add("shoot");
69 | user.setHobiesList(hobiesList);
70 | Set yearsSet = new HashSet<>();
71 | yearsSet.add(10);
72 | yearsSet.add(25);
73 | yearsSet.add(65);
74 | user.setYears(yearsSet);
75 | user.setEnd(true);
76 | //添加记录
77 | accessor.put(user);
78 | //根据key进行查询
79 | UserModel ins = accessor.get(1010001L, UserModel.class);
80 | System.out.println(ins);
81 | //根据key判断记录是否存在
82 | System.out.println(accessor.hasRow(1010001L,UserModel.class));
83 | //删除指定记录
84 | System.out.println(accessor.delete(1010001L,UserModel.class));
85 | //批量删除
86 | //System.out.println(accessor.deleteBatch(list...,UserModel.class));
87 | //扫描记录
88 | //System.out.println(accessor.scan(....));
89 | ```
90 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | org.caesar.master
6 | hbase
7 | 1.0-SNAPSHOT
8 | 4.0.0
9 | enhance hbase API
10 |
11 |
12 | 1.0.1.1
13 | 2.5.1
14 | 3.0.0-SNAPSHOT
15 | 1.2
16 | 1.9
17 | 2.4
18 | 2.6
19 | 1.2
20 | 2.2
21 | 3.1
22 | 3.3.0
23 | 3.2.1
24 | 3.1
25 | 2.2.0
26 | 12.0.1
27 | 1.3.9
28 | 1.8.8
29 | 5.5.23
30 | 2.2.2
31 | 6.1.26
32 | 6.1.14
33 | 1.9
34 | 1.6.8
35 | 4.11
36 | 1.3
37 | 3.1.0-incubating
38 | 1.10.8
39 | 2.5.0
40 | thrift
41 | 0.9.0
42 | 3.4.6
43 | 1.7.7
44 | 0.0.1-SNAPSHOT
45 | 2.6.3
46 | 2.3.1
47 | 1.3.3
48 | 4.0.23.Final
49 | 2.1.2
50 | 1.0.8
51 | 1.46
52 | hbase-common-${hbase.version}-tests.jar
53 | hbase-it-${hbase.version}-tests.jar
54 | hbase-annotations-${hbase.version}-tests.jar
55 | 2.18
56 |
57 |
58 |
59 |
60 | org.caesar
61 | utils
62 | 1.0-SNAPSHOT
63 | system
64 | ${project.basedir}/src/main/lib/utils-1.0-SNAPSHOT.jar
65 |
66 |
67 |
68 | com.hazelcast
69 | hazelcast-all
70 | 2.5
71 |
72 |
73 |
74 | net.sf.ehcache
75 | ehcache
76 | 2.7.0
77 |
78 |
79 |
80 | commons-configuration
81 | commons-configuration
82 | 1.9
83 |
84 |
85 |
86 | commons-beanutils
87 | commons-beanutils
88 | 1.8.3
89 |
90 |
91 |
92 | org.quartz-scheduler
93 | quartz
94 | 2.1.6
95 |
96 |
97 | javax.mail
98 | mail
99 | 1.4
100 |
101 |
102 |
103 | com.whalin
104 | Memcached-Java-Client
105 | 3.0.2
106 |
107 |
108 |
109 | net.sf.json-lib
110 | json-lib
111 | 2.4
112 | jdk15
113 |
114 |
115 | xom
116 | xom
117 | 1.2.5
118 |
119 |
120 | org.apache.poi
121 | poi-ooxml-schemas
122 | 3.11-beta2
123 |
124 |
125 | org.apache.poi
126 | poi-ooxml
127 | 3.10-FINAL
128 |
129 |
130 |
131 | org.apache.tika
132 | tika-core
133 | 1.5
134 |
135 |
136 | org.apache.tika
137 | tika-parsers
138 | 1.5
139 |
140 |
141 | org.apache.poi
142 | poi
143 | 3.9
144 |
145 |
146 | org.apache.xmlbeans
147 | xmlbeans
148 | 2.6.0
149 |
150 |
151 |
152 | redis.clients
153 | jedis
154 | 2.6.0
155 | jar
156 |
157 |
158 |
159 |
160 | org.apache.hadoop
161 | hadoop-common
162 | 2.7.2
163 |
164 |
165 | javax.servlet
166 | *
167 |
168 |
169 |
170 |
171 | org.apache.hbase
172 | hbase-annotations
173 | ${hbase.version}
174 |
175 |
176 | org.apache.hbase
177 | hbase-annotations
178 | ${hbase.version}
179 | test-jar
180 |
181 |
182 | org.apache.hbase
183 | hbase-common
184 | ${hbase.version}
185 |
186 |
187 | org.apache.hbase
188 | hbase-common
189 | ${hbase.version}
190 | test-jar
191 | test
192 |
193 |
194 | org.apache.hbase
195 | hbase-protocol
196 | ${hbase.version}
197 |
198 |
199 | org.apache.hbase
200 | hbase-hadoop-compat
201 | ${hbase.version}
202 |
203 |
204 | org.apache.hbase
205 | hbase-hadoop-compat
206 | ${hbase.version}
207 | test-jar
208 | test
209 |
210 |
211 | hbase-server
212 | org.apache.hbase
213 | ${hbase.version}
214 |
215 |
216 |
217 | hbase-shell
218 | org.apache.hbase
219 | ${hbase.version}
220 |
221 |
222 | hbase-shell
223 | org.apache.hbase
224 | ${hbase.version}
225 | test-jar
226 | test
227 |
228 |
229 | hbase-thrift
230 | org.apache.hbase
231 | ${hbase.version}
232 |
233 |
234 | hbase-thrift
235 | org.apache.hbase
236 | ${hbase.version}
237 | test-jar
238 | test
239 |
240 |
241 | hbase-rest
242 | org.apache.hbase
243 | ${hbase.version}
244 |
245 |
246 | hbase-rest
247 | org.apache.hbase
248 | ${hbase.version}
249 | test-jar
250 | test
251 |
252 |
253 | org.apache.hbase
254 | hbase-testing-util
255 | ${hbase.version}
256 | test
257 |
258 |
259 | org.apache.hbase
260 | hbase-prefix-tree
261 | ${hbase.version}
262 | runtime
263 |
264 |
265 | hbase-examples
266 | org.apache.hbase
267 | ${hbase.version}
268 |
269 |
270 | hbase-it
271 | org.apache.hbase
272 | ${hbase.version}
273 | test-jar
274 | test
275 |
276 |
277 | hbase-client
278 | org.apache.hbase
279 | ${hbase.version}
280 |
281 |
282 | org.codehaus.jettison
283 | jettison
284 | ${jettison.version}
285 |
286 |
287 | org.slf4j
288 | slf4j-api
289 | ${slf4j.version}
290 |
291 |
292 | com.yammer.metrics
293 | metrics-core
294 | ${metrics-core.version}
295 |
296 |
297 | com.google.guava
298 | guava
299 | ${guava.version}
300 |
301 |
302 | com.google.code.findbugs
303 | jsr305
304 | ${jsr305.version}
305 |
306 |
307 | commons-collections
308 | commons-collections
309 | ${collections.version}
310 |
311 |
312 | commons-httpclient
313 | commons-httpclient
314 | ${httpclient.version}
315 |
316 |
317 | commons-cli
318 | commons-cli
319 | ${commons-cli.version}
320 |
321 |
322 | commons-codec
323 | commons-codec
324 | ${commons-codec.version}
325 |
326 |
327 | commons-io
328 | commons-io
329 | ${commons-io.version}
330 |
331 |
332 | commons-lang
333 | commons-lang
334 | ${commons-lang.version}
335 |
336 |
337 | commons-logging
338 | commons-logging
339 | ${commons-logging.version}
340 |
341 |
342 | commons-net
343 | commons-net
344 | ${commons-net.version}
345 |
346 |
347 | org.apache.commons
348 | commons-math
349 | ${commons-math.version}
350 |
351 |
352 | org.apache.zookeeper
353 | zookeeper
354 | ${zookeeper.version}
355 |
356 |
357 | io.netty
358 | netty-all
359 | ${netty.version}
360 |
361 |
362 | org.jruby
363 | jruby-complete
364 | ${jruby.version}
365 |
366 |
367 | org.jruby.jcodings
368 | jcodings
369 | ${jcodings.version}
370 |
371 |
372 | org.jruby.joni
373 | joni
374 | ${joni.version}
375 |
376 |
377 | org.mortbay.jetty
378 | jetty-util
379 | ${jetty.version}
380 |
381 |
382 | org.mortbay.jetty
383 | jetty-sslengine
384 | ${jetty.version}
385 |
386 |
387 | org.mortbay.jetty
388 | jsp-api-2.1
389 | ${jetty.jspapi.version}
390 |
391 |
392 | org.mortbay.jetty
393 | servlet-api-2.5
394 | ${jetty.jspapi.version}
395 |
396 |
397 | org.codehaus.jackson
398 | jackson-core-asl
399 | ${jackson.version}
400 |
401 |
402 | org.codehaus.jackson
403 | jackson-mapper-asl
404 | ${jackson.version}
405 |
406 |
407 | org.codehaus.jackson
408 | jackson-jaxrs
409 | ${jackson.version}
410 |
411 |
412 | org.codehaus.jackson
413 | jackson-xc
414 | ${jackson.version}
415 |
416 |
417 | tomcat
418 | jasper-runtime
419 | ${jasper.version}
420 | runtime
421 |
422 |
423 | javax.servlet
424 | servlet-api
425 |
426 |
427 |
428 |
429 | org.jamon
430 | jamon-runtime
431 | ${jamon-runtime.version}
432 |
433 |
434 |
435 | com.google.protobuf
436 | protobuf-java
437 | ${protobuf.version}
438 |
439 |
440 | com.sun.jersey
441 | jersey-core
442 | ${jersey.version}
443 |
444 |
445 | com.sun.jersey
446 | jersey-json
447 | ${jersey.version}
448 |
449 |
450 | stax
451 | stax-api
452 |
453 |
454 |
455 |
456 | com.sun.jersey
457 | jersey-server
458 | ${jersey.version}
459 |
460 |
461 | javax.xml.bind
462 | jaxb-api
463 | ${jaxb-api.version}
464 |
465 |
466 | javax.xml.stream
467 | stax-api
468 |
469 |
470 |
471 |
472 | org.hamcrest
473 | hamcrest-core
474 | ${hamcrest.version}
475 | test
476 |
477 |
478 |
479 |
480 |
481 | maven-compiler-plugin
482 |
483 | 1.7
484 | 1.7
485 |
486 | UTF-8
487 |
488 |
489 |
490 | org.apache.maven.plugins
491 | maven-jar-plugin
492 |
493 |
494 |
495 | true
496 | lib/
497 | com.eastmoney.newHbase.test.RunMain
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 |
--------------------------------------------------------------------------------
/src/main/java/org/caesar/hbase/accessor/HbaseAccessorImpl.java:
--------------------------------------------------------------------------------
1 | package org.caesar.hbase.accessor;
2 |
3 | import org.apache.hadoop.hbase.*;
4 | import org.apache.hadoop.hbase.client.*;
5 | import org.apache.hadoop.hbase.io.compress.Compression;
6 | import org.caesar.hbase.annotation.HbaseField;
7 | import org.caesar.hbase.util.CommonUtil;
8 | import org.caesar.hbase.util.Constant;
9 | import org.caesar.hbase.util.HBasesUtil;
10 | import org.caesar.hbase.util.HbaseAnnontationUtil;
11 | import org.caesar.utils.annoatations.AnnoatationsUtil;
12 | import org.caesar.utils.beans.JackBeanUtil;
13 | import org.caesar.utils.common.ConvertsUtil;
14 | import org.slf4j.Logger;
15 | import org.slf4j.LoggerFactory;
16 |
17 | import java.io.IOException;
18 | import java.lang.reflect.Field;
19 | import java.lang.reflect.Type;
20 | import java.util.*;
21 |
22 | /**
23 | * Created by caesar.zhu on 15-11-5.
24 | */
25 | public class HbaseAccessorImpl implements IAccessor {
26 | private static Logger logger = LoggerFactory.getLogger(HbaseAccessorImpl.class);
27 |
28 | /*创建表*/
29 | @Override
30 | public boolean createTable(Class clazz) throws IOException {
31 | String tableNameStr = HbaseAnnontationUtil.getTableName(clazz);
32 | String family = HbaseAnnontationUtil.getFamilyName(clazz);
33 | HTableDescriptor table = new HTableDescriptor(TableName.valueOf(tableNameStr));
34 | if (hasTable(clazz)) {
35 | logger.warn("该表已存在");
36 | return false;
37 | }
38 | table.addFamily(new HColumnDescriptor(family));
39 | HBasesUtil.getAdmin().createTable(table);
40 | logger.info(tableNameStr + "已创建");
41 | return true;
42 | }
43 |
44 | /*删除表*/
45 | @Override
46 | public boolean deleteTable(Class clazz) throws IOException {
47 | Admin admin = HBasesUtil.getAdmin();
48 | String tableNameStr = HbaseAnnontationUtil.getTableName(clazz);
49 | HTableDescriptor table = new HTableDescriptor(TableName.valueOf(tableNameStr));
50 | if (hasTable(clazz)) {
51 | admin.disableTable(table.getTableName());
52 | admin.deleteTable(table.getTableName());
53 | logger.info(tableNameStr + "删除成功");
54 | return true;
55 | } else {
56 | logger.warn(tableNameStr + "表不存在");
57 | return false;
58 | }
59 | }
60 |
61 | /*检测是否有相应的表*/
62 | @Override
63 | public boolean hasTable(Class clazz) throws IOException {
64 | String tableNameStr = HbaseAnnontationUtil.getTableName(clazz);
65 | Admin admin = HBasesUtil.getAdmin();
66 | TableName tableName = TableName.valueOf(tableNameStr);
67 | if (admin.tableExists(tableName)) {
68 | return true;
69 | } else {
70 | return false;
71 | }
72 | }
73 |
74 | /*添加数据*/
75 | @Override
76 | public boolean put(Object t) throws IOException {
77 | String tableNameStr = HbaseAnnontationUtil.getTableName(t.getClass());
78 | Table table = HBasesUtil.getConnecton().getTable(TableName.valueOf(tableNameStr));
79 | Object keyValue = HbaseAnnontationUtil.getRowKeyValue(t);
80 | // Put put = new Put(Bytes.toBytes(keyValue));
81 | Put put = new Put(ConvertsUtil.convertToBytes(keyValue));
82 | table.put(AddCell(put, t));
83 | logger.info(t + "已添加");
84 | return true;
85 | }
86 |
87 | /*批量添加数据*/
88 | @Override
89 | public boolean putBatch(Class clazz, List list) throws IOException {
90 | String tableNameStr = HbaseAnnontationUtil.getTableName(clazz);
91 | Table table = HBasesUtil.getConnecton().getTable(TableName.valueOf(tableNameStr));
92 | List batch = new LinkedList<>();
93 | // List batch = new LinkedList();
94 | for (T t : list) {
95 | Object keyValue = HbaseAnnontationUtil.getRowKeyValue(t);
96 | Put put = new Put(ConvertsUtil.convertToBytes(keyValue));
97 | put = AddCell(put, t);
98 | batch.add(put);
99 | }
100 | Object[] results = new Object[list.size()];//用于存放批量操作结果
101 | try {
102 | table.batch(batch, results);
103 | } catch (Exception e) {
104 | e.printStackTrace();
105 | }
106 | // for (int i = 0; i < results.length; i++) {
107 | // System.out.println("Result[" + i + "]: " + results[i]);
108 | // }
109 | return true;
110 | }
111 |
112 | /*根据rowkey获得具体的model对象*/
113 | @Override
114 | public T get(Object rowkey, Class clazz) throws IOException {
115 | //查询所有列
116 | List columns = AnnoatationsUtil.getFieldsBySpecAnnoatationWithString(clazz, HbaseField.class);
117 | return get(rowkey, clazz, columns);
118 | }
119 |
120 | /*根据rowkey获得指定列,并将结果转换为具体的model对象*/
121 | @Override
122 | public T get(Object rowkey, Class clazz, List columns) throws IOException {
123 | String tableNameStr = HbaseAnnontationUtil.getTableName(clazz);
124 | String family = HbaseAnnontationUtil.getFamilyName(clazz);
125 | Table table = HBasesUtil.getConnecton().getTable(TableName.valueOf(tableNameStr));
126 | // Get get = new Get(byte[] bts);
127 | Get get = new Get(ConvertsUtil.convertToBytes(rowkey));
128 | for (String column : columns) {
129 | get.addColumn(family.getBytes(), column.getBytes());
130 | }
131 | Result result = table.get(get);
132 | if (result.isEmpty()) return null;
133 | return ResultToModel(result, clazz);
134 | }
135 |
136 | /*根据起始位置扫描表,并返回model的list集合*/
137 | @Override
138 | public List scan(Object startrowkey, Object stoprowkey, Class clazz) throws IOException {
139 | //扫描行并获取所有列
140 | return scan(startrowkey, stoprowkey, clazz);
141 | }
142 |
143 | /*根据起始位置扫描表,获取指定列,并返回model的list集合*/
144 | @Override
145 | public List scan(Object startrowkey, Object stoprowkey, Class clazz, List columns) throws IOException {
146 | String tableNameStr = HbaseAnnontationUtil.getTableName(clazz);
147 | Table table = HBasesUtil.getConnecton().getTable(TableName.valueOf(tableNameStr));
148 | String family = HbaseAnnontationUtil.getFamilyName(clazz);
149 | Scan scan = new Scan();
150 | for (String column : columns) {
151 | scan.addColumn(family.getBytes(), column.getBytes());
152 | }
153 | // scan.setStartRow(HbaseAnnontationUtil.convertToBytes(startrowkey));//设置开启位置
154 | // scan.setStopRow(HbaseAnnontationUtil.convertToBytes(stoprowkey));//设置结束位置
155 | ResultScanner scanner = table.getScanner(scan);
156 | List list = new LinkedList();
157 | for (Result result : scanner) {
158 | T model = ResultToModel(result, clazz);
159 | list.add(model);
160 | // System.out.println("find a record");
161 | }
162 | return list;
163 | }
164 |
165 | /*根据rowkey删除指定行*/
166 | @Override
167 | public boolean delete(Object rowkey, Class clazz) throws IOException {
168 | if (!hasRow(rowkey, clazz)) {
169 | return false;
170 | }
171 | String tableNameStr = HbaseAnnontationUtil.getTableName(clazz);
172 | Table table = HBasesUtil.getConnecton().getTable(TableName.valueOf(tableNameStr));
173 | Delete delete = new Delete(ConvertsUtil.convertToBytes(rowkey));
174 | table.delete(delete);
175 | return true;
176 | }
177 |
178 | /*根据rowkey(通过设置list对象中的HbaseRowkey值确定)批量删除指定行*/
179 | @Override
180 | public boolean deleteBatch(Class clazz, List list) throws IOException {
181 | String tableNameStr = HbaseAnnontationUtil.getTableName(clazz);
182 | Table table = HBasesUtil.getConnecton().getTable(TableName.valueOf(tableNameStr));
183 | List batch = new LinkedList();
184 | // List batch = new LinkedList();
185 | for (T t : list) {
186 | Object keyValue = HbaseAnnontationUtil.getRowKeyValue(t);
187 | if (!hasRow(keyValue, clazz)) {
188 | continue;
189 | }
190 | Delete delete = new Delete(ConvertsUtil.convertToBytes(keyValue));
191 | batch.add(delete);
192 | }
193 | Object[] results = new Object[list.size()];
194 | try {
195 | table.batch(batch, results);
196 | } catch (Exception e) {
197 | e.printStackTrace();
198 | }
199 | return true;
200 | }
201 |
202 | /*根据rowkey判断是否含有某条数据*/
203 | @Override
204 | public boolean hasRow(Object rowkey, Class clazz) throws IOException {
205 | String tableNameStr = HbaseAnnontationUtil.getTableName(clazz);
206 | Table table = HBasesUtil.getConnecton().getTable(TableName.valueOf(tableNameStr));
207 | Get get = new Get(ConvertsUtil.convertToBytes(rowkey));
208 | Result result = table.get(get);
209 | if (result.isEmpty()) {
210 | return false;
211 | } else {
212 | return true;
213 | }
214 | }
215 |
216 | /*修改hbase表的Schema(暂时未用)*/
217 | public static void modifySchema() throws IOException {
218 |
219 | Admin admin = HBasesUtil.getAdmin();
220 | TableName tableName = TableName.valueOf("TABLE_NAME");
221 | if (admin.tableExists(tableName)) {
222 | logger.warn("Table does not exist.");
223 | System.exit(-1);
224 | }
225 |
226 | HTableDescriptor table = new HTableDescriptor(tableName);
227 |
228 | // Update existing table
229 | HColumnDescriptor newColumn = new HColumnDescriptor("NEWCF");
230 | newColumn.setCompactionCompressionType(Compression.Algorithm.GZ);
231 | newColumn.setMaxVersions(HConstants.ALL_VERSIONS);
232 | admin.addColumn(tableName, newColumn);
233 |
234 | // Update existing column family
235 | HColumnDescriptor existingColumn = new HColumnDescriptor("CF_DEFAULT");
236 | existingColumn.setCompactionCompressionType(Compression.Algorithm.GZ);
237 | existingColumn.setMaxVersions(HConstants.ALL_VERSIONS);
238 | table.modifyFamily(existingColumn);
239 | admin.modifyTable(tableName, table);
240 |
241 | // Disable an existing table
242 | admin.disableTable(tableName);
243 |
244 | // Delete an existing column family
245 | admin.deleteColumn(tableName, "CF_DEFAULT".getBytes("UTF-8"));
246 |
247 | // Delete a table (Need to be disabled first)
248 | admin.deleteTable(tableName);
249 |
250 | }
251 |
252 | /*解析model并向put对象添加字段值*/
253 | private static Put AddCell(Put put, Object model) {
254 | String family = HbaseAnnontationUtil.getFamilyName(model.getClass());
255 | /**field字段为基本类型*/
256 | // List fields = AnnoatationsUtil.getFieldsBySpecAnnoatationWithString(model.getClass(), HbaseField.class);
257 | // for (String fieldName : fields) {
258 | // Object value = JackBeanUtil.getProperty(model, fieldName);
259 | // put.addColumn(family.getBytes(), fieldName.getBytes(), ConvertsUtil.convertToBytes(value));
260 | // }
261 | /**field字段为基本类型和集合类型的处理*/
262 | List fields = AnnoatationsUtil.getFieldsBySpecAnnoatation(model.getClass(), HbaseField.class);
263 | for (Field filed : fields) {
264 | Object value = JackBeanUtil.getProperty(model, filed.getName());
265 | if(value == null) continue;
266 | String type = filed.getGenericType().toString();
267 | //List转换
268 | if(type.startsWith("java.util.List")){//字段类型为List
269 | String newValue = "";
270 | List list = (List)value;
271 | for(Object o:list){
272 | String oo = CommonUtil.filterSpecChar(o.toString());
273 | newValue += oo + Constant.COLLECTION_SPLIT_CH;
274 | }
275 | if(list.size()==0){
276 | newValue = "";
277 | }else{
278 | newValue = newValue.substring(0,newValue.length()-1);
279 | }
280 | value = newValue;
281 | }
282 | //Set转换
283 | if(type.startsWith("java.util.Set")){//字段类型为Set
284 | String newValue = "";
285 | Set set = (Set)value;
286 | for(Object o:set){
287 | String oo = CommonUtil.filterSpecChar(o.toString());
288 | newValue += oo + Constant.COLLECTION_SPLIT_CH;
289 | }
290 | if(set.size()==0){
291 | newValue = "";
292 | }else{
293 | newValue = newValue.substring(0,newValue.length()-1);
294 | }
295 | value = newValue;
296 | }
297 | //Map转换
298 | if(type.startsWith("java.util.Map")){//字段类型为Set
299 | String newValue = "";
300 | Map map = (Map)value;
301 | for(Object key:map.keySet()){
302 | String keyStr = CommonUtil.filterSpecChar(key.toString());
303 | String valueStr = CommonUtil.filterSpecChar(map.get(key).toString());
304 | newValue += keyStr + Constant.MAP_KV_CH + valueStr + Constant.COLLECTION_SPLIT_CH;
305 | }
306 | if(map.size()==0){
307 | newValue = "";
308 | }else{
309 | newValue = newValue.substring(0,newValue.length()-1);
310 | }
311 | value = newValue;
312 | }
313 | put.addColumn(family.getBytes(), filed.getName().getBytes(), ConvertsUtil.convertToBytes(value));
314 | }
315 | return put;
316 | }
317 |
318 | /*将Hbase返回的Result对象解析为具体的model对象*/
319 | private static T ResultToModel(Result result, Class clazz) {
320 | String family = HbaseAnnontationUtil.getFamilyName(clazz);
321 | T model = JackBeanUtil.getInstanceByClass(clazz);
322 | List fields = AnnoatationsUtil.getFieldsBySpecAnnoatation(model.getClass(), HbaseField.class);
323 | for (Field field : fields) {
324 | String fieldName = field.getName();
325 | byte[] b = result.getValue(family.getBytes(), fieldName.getBytes());
326 | Object value = null;
327 | Type type = field.getGenericType();
328 | if(type.toString().startsWith("java.util.List")) {//字段类型为List
329 | value = ConvertsUtil.bytesToValue(String.class, b);
330 | if(value ==null) continue;
331 | List list = Arrays.asList(value.toString().split(Constant.COLLECTION_SPLIT_CH));
332 | value = list;
333 | }else if(type.toString().startsWith("java.util.Set")) {//字段类型为List
334 | value = ConvertsUtil.bytesToValue(String.class, b);
335 | if(value ==null) continue;
336 | Set set = new HashSet();
337 | for(Object o : value.toString().split(Constant.COLLECTION_SPLIT_CH)){
338 | set.add(o);
339 | }
340 | value = set;
341 | }else if(type.toString().startsWith("java.util.Map")) {//字段类型为Map
342 | value = ConvertsUtil.bytesToValue(String.class, b);
343 | if(value ==null) continue;
344 | Map map = new HashMap();
345 | for(Object o:value.toString().split(Constant.COLLECTION_SPLIT_CH)){
346 | Object[] arr = o.toString().split(Constant.MAP_KV_CH);
347 | map.put(arr[0],arr[1]);
348 | }
349 | value = map;
350 | }else{
351 | value = ConvertsUtil.bytesToValue(type, b);
352 | }
353 | JackBeanUtil.setProperty(model, fieldName, value);
354 | }
355 | return model;
356 | }
357 |
358 | }
359 |
--------------------------------------------------------------------------------
/src/main/java/org/caesar/hbase/accessor/IAccessor.java:
--------------------------------------------------------------------------------
1 | package org.caesar.hbase.accessor;
2 |
3 | import java.io.IOException;
4 | import java.util.List;
5 |
6 | public interface IAccessor {
7 | boolean createTable(Class clazz) throws IOException;
8 | boolean deleteTable(Class clazz) throws IOException ;
9 | boolean hasTable(Class clazz) throws IOException ;
10 | boolean put(T t) throws IOException ;
11 | boolean putBatch(Class clazz, List list) throws IOException;
12 | T get(Object rowkey, Class clazz) throws IOException ;
13 | T get(Object rowkey, Class clazz, List columns) throws IOException ;
14 | List scan(Object startrowkey, Object stoprowkey, Class clazz) throws IOException ;
15 | List scan(Object startrowkey, Object stoprowkey, Class clazz, List columns) throws IOException ;
16 | boolean delete(Object rowkey, Class clazz) throws IOException ;
17 | boolean deleteBatch(Class clazz, List list) throws IOException;
18 | boolean hasRow(Object rowkey, Class clazz) throws IOException ;
19 |
20 |
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/org/caesar/hbase/annotation/HbaseDocument.java:
--------------------------------------------------------------------------------
1 | package org.caesar.hbase.annotation;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /**
9 | * Created by caesar.zhu on 15-9-22.
10 | * 目前对hbase中family(列簇)的设计原则是每个表(model)使用一个family
11 | */
12 | @Target(ElementType.TYPE)
13 | @Retention(RetentionPolicy.RUNTIME)
14 | public @interface HbaseDocument {
15 | String table() ;
16 | String family() default "#DEFAULT_FAMILY#";
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/java/org/caesar/hbase/annotation/HbaseField.java:
--------------------------------------------------------------------------------
1 | package org.caesar.hbase.annotation;
2 |
3 |
4 | import java.lang.annotation.*;
5 |
6 | /**
7 | * Created by caesar.zhu on 15-9-22.
8 | */
9 | @Target(ElementType.FIELD)
10 | @Retention(RetentionPolicy.RUNTIME)
11 | @Inherited()
12 | public @interface HbaseField {
13 |
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/java/org/caesar/hbase/annotation/HbaseRowKey.java:
--------------------------------------------------------------------------------
1 | package org.caesar.hbase.annotation;
2 |
3 |
4 | import java.lang.annotation.*;
5 |
6 | /**
7 | * Created by caesar.zhu on 15-9-22.
8 | */
9 | @Target(ElementType.FIELD)
10 | @Retention(RetentionPolicy.RUNTIME)
11 | @Inherited()
12 | public @interface HbaseRowKey {
13 |
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/java/org/caesar/hbase/example/TestAccessor.java:
--------------------------------------------------------------------------------
1 | package org.caesar.hbase.example;
2 |
3 | import org.caesar.hbase.accessor.HbaseAccessorImpl;
4 | import org.caesar.hbase.accessor.IAccessor;
5 |
6 | import java.io.IOException;
7 | import java.util.*;
8 |
9 | /**
10 | * Created by caesar.zhu on 15-11-5.
11 | */
12 | public class TestAccessor {
13 |
14 | public static void testHbase() throws IOException {
15 | //获得访问hbase的accessor对象
16 | IAccessor accessor = new HbaseAccessorImpl();
17 | //删除表
18 | accessor.deleteTable(UserModel.class);
19 | //创建表
20 | accessor.createTable(UserModel.class);
21 | //判断表是否存在
22 | System.out.println(accessor.hasTable(UserModel.class));
23 | //new实体类并设置相关属性
24 | UserModel user = new UserModel();
25 | user.setUserId(1010001L);
26 | user.setUserName("caesar.zhu");
27 | user.setAge(30);
28 | Map scoresMap = new HashMap();
29 | scoresMap.put("history",95);
30 | scoresMap.put("geography",98);
31 | scoresMap.put("math",100);
32 | user.setScoresMap(scoresMap);
33 | List hobiesList = new ArrayList<>();
34 | hobiesList.add("basketball");
35 | hobiesList.add("swimming");
36 | hobiesList.add("shoot");
37 | user.setHobiesList(hobiesList);
38 | Set yearsSet = new HashSet<>();
39 | yearsSet.add(10);
40 | yearsSet.add(25);
41 | yearsSet.add(65);
42 | user.setYears(yearsSet);
43 | user.setEnd(true);
44 | //添加记录
45 | accessor.put(user);
46 | //根据key进行查询
47 | UserModel ins = accessor.get(1010001L, UserModel.class);
48 | System.out.println(ins);
49 | //根据key判断记录是否存在
50 | System.out.println(accessor.hasRow(1010001L,UserModel.class));
51 | //删除指定记录
52 | System.out.println(accessor.delete(1010001L,UserModel.class));
53 | //批量删除
54 | //System.out.println(accessor.deleteBatch(list...,UserModel.class));
55 | //扫描记录
56 | //System.out.println(accessor.scan(....));
57 | }
58 |
59 | public static void main(String[] args) throws IOException {
60 | testHbase();
61 | }
62 |
63 | }
64 |
--------------------------------------------------------------------------------
/src/main/java/org/caesar/hbase/example/UserModel.java:
--------------------------------------------------------------------------------
1 | package org.caesar.hbase.example;
2 |
3 | import org.apache.commons.codec.language.bm.Lang;
4 | import org.caesar.hbase.annotation.HbaseDocument;
5 | import org.caesar.hbase.annotation.HbaseField;
6 | import org.caesar.hbase.annotation.HbaseRowKey;
7 |
8 | import java.util.List;
9 | import java.util.Map;
10 | import java.util.Set;
11 |
12 | /**
13 | * Created by caesar.zhu on 15-11-4.
14 | */
15 | //定义表名和列簇名(目前只支持单个表对应一个列簇)
16 | @HbaseDocument(table = "my-table-user",family = "col_0")
17 | public class UserModel {
18 | @HbaseRowKey
19 | @HbaseField
20 | private Long userId;
21 | @HbaseField
22 | private String userName;
23 | @HbaseField
24 | private Integer age;
25 | @HbaseField
26 | private Map scoresMap;
27 | @HbaseField
28 | private List hobiesList;
29 | @HbaseField
30 | private Double schooling;
31 | @HbaseField
32 | private Set years;
33 | @HbaseField
34 | private Boolean end;
35 |
36 | public Long getUserId() {
37 | return userId;
38 | }
39 |
40 | public void setUserId(Long userId) {
41 | this.userId = userId;
42 | }
43 |
44 | public String getUserName() {
45 | return userName;
46 | }
47 |
48 | public void setUserName(String userName) {
49 | this.userName = userName;
50 | }
51 |
52 | public Integer getAge() {
53 | return age;
54 | }
55 |
56 | public void setAge(Integer age) {
57 | this.age = age;
58 | }
59 |
60 | public Map getScoresMap() {
61 | return scoresMap;
62 | }
63 |
64 | public void setScoresMap(Map scoresMap) {
65 | this.scoresMap = scoresMap;
66 | }
67 |
68 | public List getHobiesList() {
69 | return hobiesList;
70 | }
71 |
72 | public void setHobiesList(List hobiesList) {
73 | this.hobiesList = hobiesList;
74 | }
75 |
76 | public Double getSchooling() {
77 | return schooling;
78 | }
79 |
80 | public void setSchooling(Double schooling) {
81 | this.schooling = schooling;
82 | }
83 |
84 | public Set getYears() {
85 | return years;
86 | }
87 |
88 | public void setYears(Set years) {
89 | this.years = years;
90 | }
91 |
92 | public Boolean getEnd() {
93 | return end;
94 | }
95 |
96 | public void setEnd(Boolean end) {
97 | this.end = end;
98 | }
99 |
100 | @Override
101 | public String toString() {
102 | return "UserModel{" +
103 | "userId=" + userId +
104 | ", userName='" + userName + '\'' +
105 | ", age=" + age +
106 | ", scoresMap=" + scoresMap +
107 | ", hobiesList=" + hobiesList +
108 | ", schooling=" + schooling +
109 | ", years=" + years +
110 | ", end=" + end +
111 | '}';
112 | }
113 | }
114 |
--------------------------------------------------------------------------------
/src/main/java/org/caesar/hbase/util/CommonUtil.java:
--------------------------------------------------------------------------------
1 | package org.caesar.hbase.util;
2 |
3 | /**
4 | * Created by caesar.zhu on 2016/11/25.
5 | */
6 | public class CommonUtil {
7 | /**
8 | * 过滤特殊用于分隔作用的特殊字符
9 | * @param value
10 | * @return
11 | */
12 | public static String filterSpecChar(String value){
13 | return value.replaceAll(Constant.COLLECTION_SPLIT_CH,"").replaceAll(Constant.MAP_KV_CH,"");
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/java/org/caesar/hbase/util/Constant.java:
--------------------------------------------------------------------------------
1 | package org.caesar.hbase.util;
2 |
3 | /**
4 | * Created by caesar.zhu on 2016/11/25.
5 | */
6 | public class Constant {
7 | public static final String COLLECTION_SPLIT_CH = "\u0001";
8 | public static final String MAP_KV_CH = "\u0002";
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/org/caesar/hbase/util/HBasesUtil.java:
--------------------------------------------------------------------------------
1 | package org.caesar.hbase.util;
2 |
3 | import org.apache.hadoop.conf.Configuration;
4 | import org.apache.hadoop.fs.Path;
5 | import org.apache.hadoop.hbase.HBaseConfiguration;
6 | import org.apache.hadoop.hbase.client.Admin;
7 | import org.apache.hadoop.hbase.client.Connection;
8 | import org.apache.hadoop.hbase.client.ConnectionFactory;
9 |
10 | import java.io.IOException;
11 |
12 | /**
13 | * Created by caesar.zhu on 2016/11/24.
14 | */
15 | public class HBasesUtil {
16 | private static Configuration config = null;
17 | private static Connection connection = null;
18 |
19 | static {
20 | config = HBaseConfiguration.create();
21 | config.addResource(new Path("hbase-site.xml"));
22 | // config.addResource(new Path("core-site.xml"));
23 | }
24 |
25 | /*获得Connection连接*/
26 | public static Connection getConnecton(){
27 | if(connection == null || connection.isClosed()){
28 | try {
29 | connection = ConnectionFactory.createConnection(config);
30 | } catch (IOException e) {
31 | e.printStackTrace();
32 | }
33 | }
34 | return connection;
35 | }
36 |
37 | public static Admin getAdmin(){
38 | Admin admin = null;
39 | try {
40 | admin = getConnecton().getAdmin();
41 | } catch (IOException e) {
42 | e.printStackTrace();
43 | }
44 | return admin;
45 | }
46 |
47 |
48 | public static void main(String[] args) throws IOException {
49 | System.out.println(getAdmin().getClusterStatus());
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/main/java/org/caesar/hbase/util/HbaseAnnontationUtil.java:
--------------------------------------------------------------------------------
1 | package org.caesar.hbase.util;
2 |
3 | import org.caesar.hbase.annotation.HbaseDocument;
4 | import org.caesar.hbase.annotation.HbaseRowKey;
5 | import org.caesar.utils.annoatations.AnnoatationsUtil;
6 |
7 | /**
8 | * Created by caesar.zhu on 15-11-4.
9 | */
10 | public class HbaseAnnontationUtil {
11 |
12 | /*获取表名*/
13 | public static String getTableName(Class> clazz){
14 | return clazz.getAnnotation(HbaseDocument.class).table();
15 | }
16 |
17 | /*获取列簇名*/
18 | public static String getFamilyName(Class> clazz){
19 | return clazz.getAnnotation(HbaseDocument.class).family();
20 | }
21 |
22 | /*获得model的HbaseRowKey字段名*/
23 | public static String getRowKeyName(Class clazz) {
24 | return AnnoatationsUtil.getFieldNameByFieldAnnoatation(clazz,HbaseRowKey.class);
25 | }
26 |
27 | /*获得model的HbaseRowKey的值*/
28 | public static Object getRowKeyValue(T model){
29 | return AnnoatationsUtil.getFieldValueByFieldAnnonation(model,HbaseRowKey.class);
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/lib/utils-1.0-SNAPSHOT.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jacksoup/HbaseAPI/ff1380d5290a18c7c8fae492e512d152c1324a11/src/main/lib/utils-1.0-SNAPSHOT.jar
--------------------------------------------------------------------------------
/src/main/resources/hbase-site.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | hbase.zookeeper.quorum
6 |
7 | namenode1,namenode2,datanode1,datanode2,datanode3
8 |
9 |
--------------------------------------------------------------------------------
/src/main/resources/logback.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | false
5 |
6 | %d{HH:mm:ss.SSS} %highlight(%-5level) [%thread] %cyan(%logger) - %msg%n
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------