HBase常用服务调用封装

本文主要介绍了在生产环境中,针对HBase的数据获取操作,如get、scan和scan range,进行的服务封装,旨在提升数据访问效率。
摘要由CSDN通过智能技术生成

一、前言


      生产刚刚接入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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值