1 import org.apache.commons.lang.StringUtils; 2 import org.apache.hadoop.conf.Configuration; 3 import org.apache.hadoop.hbase.*; 4 import org.apache.hadoop.hbase.client.*; 5 import org.apache.hadoop.hbase.io.compress.Compression.Algorithm; 6 import org.apache.hadoop.hbase.util.Bytes; 7 import org.slf4j.Logger; 8 import org.slf4j.LoggerFactory; 9 10 import java.io.Closeable; 11 import java.io.IOException; 12 import java.io.Serializable; 13 import java.util.ArrayList; 14 import java.util.HashMap; 15 import java.util.List; 16 import java.util.Map; 17 18 /** 19 * <p> 20 * HBase工具类 21 * </p> 22 * 23 * @author 用户名 2015年6月18日 上午8:58:38 24 * @version V1.0 25 * @modify by user: {修改人} 2015年6月18日 26 * @modify by reason:{方法名}:{原因} 27 */ 28 public class HBaseHolder implements Serializable,Closeable { 29 30 // 日志记录器 31 protected static final Logger LOGGER = LoggerFactory.getLogger(HBaseHolder.class); 32 private static final int DEFAULT_MAX_VERSIONS = 3; 33 // HBase配置 34 private Configuration config; 35 private Admin admin; 36 private Connection connection; 37 38 public HBaseHolder() { 39 config = HBaseConfiguration.create(); 40 } 41 42 public HBaseHolder(Configuration config) { 43 this.config = config; 44 } 45 46 /** 47 * 从连接池获取HTable对象 48 * 49 * @param tableName 50 * @return 51 * @throws IOException 52 * @author 53 */ 54 public Table getTable(String tableName) throws IOException { 55 return getConnection().getTable(TableName.valueOf(tableName)); 56 } 57 58 /** 59 * 获取HAdmin对象,建表等操作 60 * 61 * @return 62 * @throws IOException 63 * @author 64 */ 65 public Admin getHBaseAdmin() throws IOException { 66 if (admin == null) { 67 admin = getConnection().getAdmin(); 68 } 69 return admin; 70 } 71 72 /** 73 * 关闭HTable对象 74 * 75 * @param table 76 * @author 77 */ 78 public void doCloseTable(Table table) { 79 if (table == null) { 80 return; 81 } 82 try { 83 table.close(); 84 } catch (IOException e) { 85 e.printStackTrace(); 86 } 87 } 88 89 /** 90 * 创建表操作 91 * 92 * @param tableName 93 * @param families 94 * @author 95 */ 96 public void createTable(String tableName, String[] families) { 97 createTable(tableName, DEFAULT_MAX_VERSIONS, null, families); 98 } 99 100 /** 101 * 创建表操作 102 * 103 * @param tableName 104 * @param splitKeys 105 * @param families 106 * @author 107 */ 108 public void createTable(String tableName, byte[][] splitKeys, String[] families) { 109 createTable(tableName, DEFAULT_MAX_VERSIONS, splitKeys, families); 110 } 111 112 /** 113 * 创建表操作 114 * 115 * @param tableName 116 * @param maxVersions 117 * @param families 118 * @author 119 */ 120 public void createTable(String tableName, int maxVersions, String[] families) { 121 createTable(tableName, maxVersions, null, families); 122 } 123 124 /** 125 * 创建表操作 126 * 127 * @param tableName 128 * @param family 129 * @author 130 */ 131 public void createTable(String tableName, int maxVersions, byte[][] splitKeys, String[] families) { 132 // 参数判空 133 if (StringUtils.isBlank(tableName) || families == null || families.length <= 0) { 134 return; 135 } 136 try { 137 // 表不存在则创建 138 if (!getHBaseAdmin().tableExists(TableName.valueOf(tableName))) { 139 HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(tableName)); 140 for (String family : families) { 141 HColumnDescriptor columnDescriptor = new HColumnDescriptor(family); 142 columnDescriptor.setCompressionType(Algorithm.SNAPPY); 143 columnDescriptor.setMaxVersions(maxVersions); 144 desc.addFamily(columnDescriptor); 145 } 146 if (splitKeys != null) { 147 getHBaseAdmin().createTable(desc, splitKeys); 148 } else { 149 getHBaseAdmin().createTable(desc); 150 } 151 } else { 152 LOGGER.warn("Table " + tableName + " already exists."); 153 } 154 } catch (IOException e) { 155 LOGGER.error("", e); 156 } 157 } 158 159 /** 160 * 删除表 161 * 162 * @param tableName 163 * @author 164 */ 165 public void dropTable(String tableName) { 166 Admin admin = null; 167 try { 168 admin = getHBaseAdmin(); 169 if (admin.tableExists(TableName.valueOf(tableName))) { 170 admin.disableTable(TableName.valueOf(tableName)); 171 admin.deleteTable(TableName.valueOf(tableName)); 172 } 173 } catch (IOException e) { 174 LOGGER.error("drop table error." + e); 175 } finally { 176 if (null != admin) { 177 try { 178 admin.close(); 179 } catch (IOException e) { 180 LOGGER.error("close admin error " + e); 181 } 182 } 183 } 184 } 185 186 /** 187 * 获取单个列值 188 * 189 * @param tableName 190 * @param rowkey 191 * @return 192 * @author 193 */ 194 public byte[] get(String tableName, String rowkey, String family, String qualifier) { 195 Table table = null; 196 try { 197 Get get = new Get(Bytes.toBytes(rowkey)); 198 get.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier)); 199 table = getTable(tableName); 200 if (getHBaseAdmin().tableExists(TableName.valueOf(tableName))) { 201 Result result = table.get(get); 202 return result.getValue(Bytes.toBytes(family), Bytes.toBytes(qualifier)); 203 } else { 204 LOGGER.warn("Table " + tableName + " does not exist."); 205 } 206 } catch (IOException e) { 207 LOGGER.error("获取列值失败! " + e); 208 e.printStackTrace(); 209 } 210 return null; 211 } 212 213 /** 214 * 获取单个列值,字符串返回 215 * 216 * @param tableName 217 * @param rowkey 218 * @return 219 * @author zhanglei11 220 */ 221 public String getString(String tableName, String rowkey, String family, String qualifier) { 222 return Bytes.toString(get(tableName, rowkey, family, qualifier)); 223 } 224 225 /** 226 * 获取一行中某列族的值 227 * 228 * @param tableName 229 * @param rowkey 230 * @return 231 * @author 232 */ 233 public Map<String, byte[]> getMapByKeyAndFamily(String tableName, String rowkey, String family) { 234 Map<String, byte[]> map = new HashMap<String, byte[]>(); 235 Table table = null; 236 try { 237 Get get = new Get(Bytes.toBytes(rowkey)); 238 get.addFamily(Bytes.toBytes(family)); 239 table = getTable(tableName); 240 if (getHBaseAdmin().tableExists(TableName.valueOf(tableName))) { 241 Result result = table.get(get); 242 for (Cell cell : result.rawCells()) { 243 byte[] q = CellUtil.cloneQualifier(cell); 244 byte[] v = CellUtil.cloneValue(cell); 245 map.put(Bytes.toString(q), v); 246 } 247 } else { 248 LOGGER.warn("Table " + tableName + " does not exist."); 249 } 250 } catch (IOException e) { 251 e.printStackTrace(); 252 } 253 return map; 254 } 255 256 /** 257 * 获取一整行的值 258 * 259 * @param tableName 260 * @param rowkey 261 * @return 262 * @author 263 */ 264 public Map<String, byte[]> getRowMap(String tableName, String rowkey) { 265 Map<String, byte[]> map = new HashMap<String, byte[]>(); 266 Table table = null; 267 try { 268 Get get = new Get(Bytes.toBytes(rowkey)); 269 table = getTable(tableName); 270 if (getHBaseAdmin().tableExists(TableName.valueOf(tableName))) { 271 Result result = table.get(get); 272 for (Cell cell : result.rawCells()) { 273 byte[] q = CellUtil.cloneQualifier(cell); 274 byte[] v = CellUtil.cloneValue(cell); 275 map.put(Bytes.toString(q), v); 276 } 277 } else { 278 LOGGER.warn("Table " + tableName + " does not exist."); 279 } 280 } catch (IOException e) { 281 e.printStackTrace(); 282 } 283 return map; 284 } 285 286 /** 287 * 获取记录 288 * 289 * @param tableName 290 * @param rowkeys 291 * @return 292 */ 293 public Result[] getRecodes(String tableName, List<String> rowkeys) { 294 Table table = null; 295 if (rowkeys == null || rowkeys.size() == 0) { 296 LOGGER.warn("Has no rowkeys to get."); 297 return null; 298 } 299 try { 300 List<Get> gets = new ArrayList<>(); 301 Get get = null; 302 for (String rowkey : rowkeys) { 303 get = new Get(Bytes.toBytes(rowkey)); 304 gets.add(get); 305 } 306 table = getTable(tableName); 307 if (getHBaseAdmin().tableExists(TableName.valueOf(tableName))) { 308 Result[] results = table.get(gets); 309 return results; 310 } else { 311 LOGGER.warn("Table " + tableName + " does not exist."); 312 return null; 313 } 314 } catch (IOException e) { 315 LOGGER.error("get table [{}] recodes error", tableName, e); 316 return null; 317 } 318 } 319 320 /** 321 * 获取记录 322 * 323 * @param tableName 324 * @param rowkey 325 * @return 326 */ 327 public Result getRecode(String tableName, String rowkey) { 328 Table table = null; 329 try { 330 Get get = new Get(Bytes.toBytes(rowkey)); 331 table = getTable(tableName); 332 if (getHBaseAdmin().tableExists(TableName.valueOf(tableName))) { 333 Result result = table.get(get); 334 return result; 335 } else { 336 LOGGER.warn("Table " + tableName + " does not exist."); 337 return null; 338 } 339 } catch (IOException e) { 340 LOGGER.error("get table [{}] recodes error", tableName, e); 341 return null; 342 } 343 } 344 345 /** 346 * 获取记录 347 * 348 * @param tableName 349 * @param gets 350 * @return 351 */ 352 public Result[] getRecodesByGets(String tableName, List<Get> gets) { 353 Table table = null; 354 if (gets == null || gets.size() == 0) { 355 LOGGER.warn("Has no gets to get."); 356 return null; 357 } 358 try { 359 table = getTable(tableName); 360 if (getHBaseAdmin().tableExists(TableName.valueOf(tableName))) { 361 Result[] results = table.get(gets); 362 return results; 363 } else { 364 LOGGER.warn("Table " + tableName + " does not exist."); 365 return null; 366 } 367 } catch (IOException e) { 368 LOGGER.error("get table [{}] recodes error", tableName, e); 369 return null; 370 } 371 } 372 373 /** 374 * 获取记录 375 * 376 * @param tableName 377 * @param get 378 * @return 379 */ 380 public Result getRecodeByGet(String tableName, Get get) { 381 Table table = null; 382 try { 383 table = getTable(tableName); 384 if (getHBaseAdmin().tableExists(TableName.valueOf(tableName))) { 385 Result result = table.get(get); 386 return result; 387 } else { 388 LOGGER.warn("Table " + tableName + " does not exist."); 389 return null; 390 } 391 } catch (IOException e) { 392 LOGGER.error("get table [{}] recodes error", tableName, e); 393 return null; 394 } 395 } 396 397 /** 398 * 检测HBase服务是否可用 399 * 400 * @return 401 * @author 402 */ 403 public boolean isHBaseAvailable() { 404 try { 405 HBaseAdmin.checkHBaseAvailable(config); 406 } catch (ZooKeeperConnectionException zkce) { 407 LOGGER.error("", zkce); 408 return false; 409 } catch (MasterNotRunningException e) { 410 LOGGER.error("", e); 411 return false; 412 } catch (Exception e) { 413 LOGGER.error("Check HBase available throws an Exception. We don‘t know whether HBase is running or not.", e); 414 return false; 415 } 416 return true; 417 } 418 419 public Connection getConnection() { 420 if (connection == null) { 421 try { 422 connection = ConnectionFactory.createConnection(config); 423 } catch (IOException e) { 424 LOGGER.error("Create HBase connect error.", e); 425 } 426 } 427 return connection; 428 } 429 430 @Override 431 public void close() throws IOException { 432 if(admin != null){ 433 admin.close(); 434 admin = null; 435 } 436 if(connection != null){ 437 connection.close(); 438 connection = null; 439 } 440 } 441 }
时间: 2024-10-10 10:58:18