*I have modified the spring class HBaseConfigurationFactoryBean in a way that will allow developers to set any property of the HBaseConfiguration for the client.*
The updated configuration will look like: <bean id="hbaseConfiguration" class="com.gumgum.hbase.HBaseConfigurationFactoryBean"> <property name="hbaseProperties"> <props> <!-- hbase.zookeeper.quorum is required. Other properties are optional--> <prop key="hbase.zookeeper.quorum">${hbase.zookeeper.quorum}</prop> </props> </property> </bean> I have updated the original spring issue with the new class. Here is the url of the issue: http://jira.springframework.org/browse/SPR-5950 I am also attaching the three classes with this email: HbaseCallback.java, HBaseConfigurationFactoryBean.java and HBaseTemplate.java Here is the remaining configuration you will need to do: <bean id="hbaseTemplate" class="com.gumgum.hbase.HBaseTemplate"> <constructor-arg ref="hTablePool"/> </bean> <bean id="hTablePool" class="org.apache.hadoop.hbase.client.HTablePool"> <constructor-arg ref="hbaseConfiguration"/> <constructor-arg value="${hbase.htable.pool.size}"/> </bean> Regards, Vaibhav Puranik Gumgum
package org.springframework.hbase; import org.apache.hadoop.hbase.client.HTable; /** * Defines methods to get HTable and close HTable. Modeled after DataSource interface in JDBC. * * @author Vaibhav Puranik * @version $Id: HBaseCallback.java 3429 2009-07-21 02:10:28Z vaibhav $ */ public interface HBaseCallback { /** * Gets called by HbaseTemplate.execute with an active HTable for the given tablename. * @param htable htable instance for the given tablename. * @return a result object, or null if none * @throws Exception */ Object doInHbase(HTable htable) throws Exception; }
package com.gumgum.hbase; import java.util.Properties; import java.util.Set; import org.apache.hadoop.hbase.HBaseConfiguration; import org.springframework.beans.factory.FactoryBean; /** * Creates HBase Configuration for the given HBase master. * @author Vaibhav Puranik * @version $Id: HBaseConfigurationFactoryBean.java 3458 2009-07-24 21:29:59Z vaibhav $ */ public class HBaseConfigurationFactoryBean implements FactoryBean { /** * You can set various hbase client properties. * hbase.zookeeper.quorum must be set. */ private Properties hbaseProperties; @Override public Object getObject() throws Exception { if (hbaseProperties != null) { HBaseConfiguration config = new HBaseConfiguration(); Set<String> propertyNames = hbaseProperties.stringPropertyNames(); for (String propertyName : propertyNames) { config.set(propertyName, hbaseProperties.getProperty(propertyName)); } return config; } else { throw new RuntimeException("hbase properties cannot be null"); } } @SuppressWarnings("unchecked") @Override public Class getObjectType() { return HBaseConfiguration.class; } @Override public boolean isSingleton() { return true; } public Properties getHbaseProperties() { return hbaseProperties; } public void setHbaseProperties(Properties hbaseProperties) { this.hbaseProperties = hbaseProperties; } }
package org.springframework.hbase; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.HTablePool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Helper class that simplifies Hbase data access code. This class will call HTablePool's getTable and * closeHtable methods before and after your action. * * @author Vaibhav Puranik * @version $Id: HBaseTemplate.java 3429 2009-07-21 02:10:28Z vaibhav $ */ public class HBaseTemplate { private static final Logger LOGGER = LoggerFactory.getLogger(HBaseTemplate.class); private HTablePool hTablePool; public HBaseTemplate(HTablePool hTablePool) { this.hTablePool = hTablePool; } public Object execute(String tablename, HBaseCallback action) { Object result = null; try { HTable hTable = hTablePool.getTable(tablename); result = action.doInHbase(hTable); hTablePool.putTable(hTable); } catch (Exception e) { LOGGER.error("Exception occured in execute method: ", e); } return result; } public HTablePool getHTablePool() { return hTablePool; } public void setHTablePool(HTablePool tablePool) { hTablePool = tablePool; } }