hbase持有者工具类

  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 }

 

posted on 2017-02-09 21:02  聂政didi  阅读(1213)  评论(0编辑  收藏  举报

导航