All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.cloudgraph.hbase.connect.HBaseConnectionManager Maven / Gradle / Ivy

/**
 *        CloudGraph Community Edition (CE) License
 * 
 * This is a community release of CloudGraph, a dual-license suite of
 * Service Data Object (SDO) 2.1 services designed for relational and 
 * big-table style "cloud" databases, such as HBase and others. 
 * This particular copy of the software is released under the 
 * version 2 of the GNU General Public License. CloudGraph was developed by 
 * TerraMeta Software, Inc.
 * 
 * Copyright (c) 2013, TerraMeta Software, Inc. All rights reserved.
 * 
 * General License information can be found below.
 * 
 * This distribution may include materials developed by third
 * parties. For license and attribution notices for these
 * materials, please refer to the documentation that accompanies
 * this distribution (see the "Licenses for Third-Party Components"
 * appendix) or view the online documentation at 
 * . 
 */
package org.cloudgraph.hbase.connect;


import java.io.IOException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.NamespaceNotFoundException;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
import org.apache.hadoop.hbase.client.Admin;
import org.cloudgraph.config.CloudGraphConfig;
import org.cloudgraph.config.TableConfig;
import org.cloudgraph.hbase.service.CloudGraphContext;
import org.cloudgraph.state.StateException;
import org.cloudgraph.store.service.GraphServiceException;


/**
 * Manages HBase table pool and table interface access.
 * @see CloudGraphContext
 * @see TableConfig
 * @author Scott Cinnamond
 * @since 0.5
 */
public class HBaseConnectionManager {
	
	/** not currently used as connection pools for HBase 1.0.x client not recommended */
	public static final String CONNECTION_POOL_MIN_SIZE = "org.plasma.sdo.access.provider.hbase.ConnectionPoolMinSize";
	public static final String CONNECTION_POOL_MAX_SIZE = "org.plasma.sdo.access.provider.hbase.ConnectionPoolMaxSize";

	private GenericObjectPool pool;

	private static final Log log = LogFactory.getLog(HBaseConnectionManager.class);

    private static volatile HBaseConnectionManager instance;
    private Configuration config;
	 

	private HBaseConnectionManager() {		
		this.config = CloudGraphContext.instance().getConfig();
		
		int min = this.config.getInt(CONNECTION_POOL_MIN_SIZE, 1);
		int max = this.config.getInt(CONNECTION_POOL_MAX_SIZE, 20);
		
		GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
		poolConfig.setMinIdle(min);     
		poolConfig.setMaxTotal(max);
		PooledConnectionFactory factory = new PooledConnectionFactory(this.config);
		this.pool = new GenericObjectPool(factory, poolConfig);
		factory.setPool(pool);
	}

	public static HBaseConnectionManager instance()
    {
        if (instance == null)
            initInstance();   
        return instance;     
    }

    private static synchronized void initInstance()
    {
        if (instance == null)
            instance = new HBaseConnectionManager();
    }
 
	protected void finalize() {
		log.debug("Finalizing ConnectionManager");
		try {
			super.finalize();
		} catch (Throwable ex) {
			log.error("ConnectionManager finalize failed to disconnect: ", ex);
		}
	}
	
	public Connection getConnection()  
	{
        try {
			return this.pool.borrowObject();
		} catch (Exception e) {
			throw new GraphServiceException(e);
		}
        finally {
        }
    }
			
	public void createTable(Connection connection, TableName name) {

		Admin admin = null;
    	try {
    		admin = connection.getAdmin();
    		TableConfig tableConfig = CloudGraphConfig.getInstance().getTable(name.getNamespaceAsString(), 
    				name.getNameAsString());
    		HTableDescriptor tableDesc = new HTableDescriptor(name);
	    	HColumnDescriptor fam1 = new HColumnDescriptor(tableConfig.getDataColumnFamilyName().getBytes());
	    	tableDesc.addFamily(fam1);
	    	try {
			    admin.createTable(tableDesc);
	    	}
	    	catch (NamespaceNotFoundException nnf) {
				NamespaceDescriptor namespace =
					NamespaceDescriptor.create(name.getNamespaceAsString())
					    .addConfiguration("Description", "cloudgraph generated namespace").build();
				admin.createNamespace(namespace);
			    admin.createTable(tableDesc);	    		
	    	}
		} catch (MasterNotRunningException e1) {
			throw new StateException(e1);
		} catch (ZooKeeperConnectionException e1) {
			throw new StateException(e1);
		} catch (IOException e) {
			throw new StateException(e);
		} finally {
			if (admin != null)
				try {
					admin.close();
				} catch (IOException e) {
					log.error(e.getMessage(), e);
				}
		}
    }

	public void deleteTable(Connection connection, TableName name) {

		Admin admin = null;
    	try {
    		admin = connection.getAdmin();
    		admin.disableTable(name);
    		admin.deleteTable(name);
		} catch (MasterNotRunningException e1) {
			throw new StateException(e1);
		} catch (ZooKeeperConnectionException e1) {
			throw new StateException(e1);
		} catch (IOException e) {
			throw new StateException(e);
		} finally {
			if (admin != null)
				try {
					admin.close();
				} catch (IOException e) {
					log.error(e.getMessage(), e);
				}
		}
    }
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy