├── .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 | --------------------------------------------------------------------------------