package brickhouse.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
import org.apache.hadoop.hive.serde2.objectinspector.StandardConstantMapObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
/**
* Common code to access HTables
*
* @author jeromebanks
*/
public class HTableFactory {
private static final Logger LOG = Logger.getLogger(HTableFactory.class);
static String FAMILY_TAG = "family";
static String QUALIFIER_TAG = "qualifier";
static String TABLE_NAME_TAG = "table_name";
static String ZOOKEEPER_QUORUM_TAG = "hbase.zookeeper.quorum";
static String AUTOFLUSH_TAG = "hbase.client.autoflush";
private static Map<String, HTable> htableMap = new HashMap<String, HTable>();
private static Configuration hbConfig;
public static HTable getHTable(Map<String, String> configMap) throws IOException {
String tableName = configMap.get(TABLE_NAME_TAG);
HTable table = htableMap.get(tableName);
if (table == null) {
if (hbConfig == null) {
Configuration config = new Configuration(true);
config.set("hbase.zookeeper.quorum", configMap.get(ZOOKEEPER_QUORUM_TAG));
for (Entry<String, String> entry : configMap.entrySet()) {
config.set(entry.getKey(), entry.getValue());
}
hbConfig = HBaseConfiguration.create(config);
}
table = new HTable(hbConfig, tableName);
if (configMap.containsKey(AUTOFLUSH_TAG)) {
Boolean flushFlag = Boolean.valueOf(configMap.get(AUTOFLUSH_TAG));
table.setAutoFlush(flushFlag);
}
htableMap.put(tableName, table);
}
return table;
}
public static Map<String, String> getConfigFromConstMapInspector(ObjectInspector objInspector) throws UDFArgumentException {
if (!(ObjectInspectorUtils.isConstantObjectInspector(objInspector))
|| !(objInspector instanceof StandardConstantMapObjectInspector)) {
throw new UDFArgumentException("HBase parameters must be a constant map");
}
StandardConstantMapObjectInspector constMapInsp = (StandardConstantMapObjectInspector) objInspector;
Map<?, ?> uninspMap = constMapInsp.getWritableConstantValue();
System.out.println(" Uninsp Map = " + uninspMap + " size is " + uninspMap.size());
Map<String, String> configMap = new HashMap<String, String>();
for (Object uninspKey : uninspMap.keySet()) {
Object uninspVal = uninspMap.get(uninspKey);
String key = ((StringObjectInspector) constMapInsp.getMapKeyObjectInspector()).getPrimitiveJavaObject(uninspKey);
String val = ((StringObjectInspector) constMapInsp.getMapValueObjectInspector()).getPrimitiveJavaObject(uninspVal);
LOG.info(" Key " + key + " VAL = " + configMap.get(key));
System.out.println(" Key " + key + " VAL = " + configMap.get(key));
configMap.put(key, val);
}
return configMap;
}
/**
* Throws RuntimeException if config is incomplete.
*
* @param configIn
*/
public static void checkConfig(Map<String, String> configIn) {
if (!configIn.containsKey(FAMILY_TAG) ||
!configIn.containsKey(QUALIFIER_TAG) ||
!configIn.containsKey(TABLE_NAME_TAG) ||
!configIn.containsKey(ZOOKEEPER_QUORUM_TAG)) {
String errorMsg = "Error while doing HBase operation with config " + configIn + " ; Config is missing for: " + FAMILY_TAG + " or " +
QUALIFIER_TAG + " or " + TABLE_NAME_TAG + " or " + ZOOKEEPER_QUORUM_TAG;
LOG.error(errorMsg);
throw new RuntimeException(errorMsg);
}
}
}