一、前言
生产刚刚接入HBase,应用对其数据的获取的几种方式如get,scan,scan range进行了相关服务封装
二、服务封装
package com.hbase.sources;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.RegexStringComparator;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.util.Bytes;
import java.util.ConcurrentHashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import com.hbase.utils.StringUtilsx;
/**
*
* 类名: HbaseService.java
* 描述:Hbase数据获取操作类
* @author tanjie
* 创建时间: 2017年4月12日 上午10:44:37
* @version V1.0.0
*/
@Service("hbaseSource")
public class HBaseSource {
private final Logger LOGGER = LoggerFactory.getLogger(HBaseSource.class);
/**
* HbaseSource连接池
*/
private static Map<String, HBaseSource> hbasepool = new ConcurrentHashMap<String, HBaseSource>();
/**
* HbaseSource实例创建时间池
*/
private static Map<String,Date> createTimes = new ConcurrentHashMap<String, Date>();
/**
* HbaseSource实例访问时间池
*/
private static Map<String,Date> lastTimes = new ConcurrentHashMap<String,Date>();
/**
* hbase连接的配置属性
*/
private Configuration conf;
/**
* hbase的连接
*/
private Connection connection;
/**
* 创建时间多长就清除连接
*/
private long intervalsTime = 4 * 1000 * 60 * 60;
/**
* 多长时间没调用就清除连接
*/
// private long instanceTime = 2*60*1000;
/**
*
* @author tanjie
* 创建时间: 2017年4月15日 上午10:56:28
* 描述: 定时销毁创建时间过久或空闲时间过长的连接
*/
@Scheduled(cron ="0 0/5 * * * ?")
public void clearHbaseConnection(){
LOGGER.info("定时任务开始工作!");
LOGGER.info("clear hbase connection hbasepool :" + hbasepool.size());
LOGGER.info("clear hbase connection createTimes :" + createTimes.size());
LOGGER.info("clear hbase connection lastTimes :" + lastTimes.size());
Date currentDate = new Date();
if(null != createTimes && createTimes.size() !=0){
for(final Map.Entry<String, Date> ctime : createTimes.entrySet()){
if(null != ctime.getValue() && currentDate.getTime()-ctime.getValue().getTime()>=intervalsTime){
LOGGER.info("clear hbase connection 创建时间太长被清理 :" + ctime.getKey());
hbasepool.get(ctime).closeConnection();
hbasepool.remove(ctime);
createTimes.remove(ctime.getKey());
lastTimes.remove(ctime.getKey());
}
}
}
if(null != lastTimes && lastTimes.size()!=0){
for(final Map.Entry<String,Date> m:lastTimes.entrySet()){
if(m.getValue()!=null&& currentDate.getTime()-m.getValue().getTime()>=1000*60*20){
LOGGER.info("clear hbase connection 调用时间间隔太长被清理 :" + m.getKey());
hbasepool.get(m.getKey()).closeConnection();
hbasepool.remove(m.getKey());
createTimes.remove(m.getKey());
lastTimes.remove(m.getKey());
}
}
}
}
/**
*
* @author tanjie
* 创建时间: 2017年4月15日 上午9:11:54
* 描述: 创建表
* @param hbaseTableName 表名
* @param columnFamily 列族民
* @throws IOException
*/
public void createHbaseTable(String hbaseTableName, String columnFamily)
throws IOException {
if(null == connection){
return;
}
Admin admin = connection.getAdmin();
TableName tableName = Ta