package com.xx.xx.service.spark;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.HTableInterface;
import org.apache.hadoop.hbase.client.HTablePool;
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.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.FilterList.Operator;
import org.apache.hadoop.hbase.filter.PrefixFilter;
import org.apache.log4j.Logger;
import com.xx.xx.common.util.PropertiesUtils;
public class HbaseUtils {
private final static Logger LOG = Logger.getLogger(HbaseUtils.class);
private static final String zookeeperQuorum = (String) PropertiesUtils
.getJddpConf().get("zookeeperQuorum");
private static HTablePool tablePool;
private final static int BATCH_SIZE = 1000;
public final static String QUERY_REPORT_TABLE = "query_report";
public final static String QUERY_STATUS_TABLE = "query_status";
public final static String CONSOLE_LOG_TABLE = "console_log";
public final static String TRY_RUN_RESULT_TABLE = "try_run_result";
public final static String COLUMN_FAMILY = "cf";
public final static String QUALIFIER = "c";
static {
Configuration conf = new Configuration();
LOG.info("zookeeperQuorum: " + zookeeperQuorum);
conf.set("hbase.zookeeper.quorum", zookeeperQuorum);
Configuration hbaseConf = HBaseConfiguration.create(conf);
tablePool = new HTablePool(hbaseConf, 30);
}
private List<Result> getResult(String hbaseTableName, String columnFamily,
String qualifier, String keyPrefix) {
List<Result> result = new ArrayList<Result>();
HTableInterface table = null;
try {
table = tablePool.getTable(hbaseTableName);
Scan scan = new Scan();
List<Filter> filters = new ArrayList<Filter>();
Filter prifixFilter = new PrefixFilter(keyPrefix.getBytes());
filters.add(prifixFilter);
Filter allFilter = new FilterList(Operator.MUST_PASS_ALL, filters);
scan.setFilter(allFilter);
ResultScanner rs = table.getScanner(scan);
try {
for (Result r : rs) {
result.add(r);
}
} finally {
rs.close();
}
} catch (Throwable e) {
LOG.error("ERROR: get table: " + hbaseTableName + ", prefix key:"
+ keyPrefix, e);
} finally {
if (table != null)
try {
table.close();
} catch (IOException e) {
LOG.error("close table error, get table: " + hbaseTableName
+ ", prefix key:" + keyPrefix, e);
}
}
return result;
}
private Map<String, String> read(String hbaseTableName, String columnFamily,
String qualifier, String keyPrefix) {
Map<String, String> result = new HashMap<String, String>();
List<Result> resultList = getResult(hbaseTableName, columnFamily,
qualifier, keyPrefix);
for (Result r : resultList) {
KeyValue[] kv = r.raw();
for (int i = 0; i < kv.length; i++) {
result.put(new String(kv[i].getRow()), new String(kv[i].getValue()));
}
}
return result;
}
private void write(String hbaseTableName, String columnFamily,
String qualifier, String keyPrefix, Collection<String> contents) {
HTableInterface table = null;
try {
table = tablePool.getTable(hbaseTableName);
List<Put> putList = new ArrayList<Put>();
int idx = 0;
for (String line : contents) {
String rowKey = keyPrefix + idx;
if (contents.size() == 1)
rowKey = keyPrefix;
idx++;
Put put = new Put(rowKey.getBytes());
put.add(columnFamily.getBytes(), qualifier.getBytes(),
line.getBytes());
putList.add(put);
if (putList.size() >= BATCH_SIZE) {
table.put(putList);
table.flushCommits();
putList.clear();
}
}
table.put(putList);
table.flushCommits();
} catch (Throwable e) {
LOG.error("ERROR: write into table: " + hbaseTableName + ", prefix key:"
+ keyPrefix, e);
} finally {
if (table != null) {
try {
table.close();
} catch (IOException e) {
LOG.error("close table error, write into table: "
+ hbaseTableName + ", prefix key:" + keyPrefix, e);
}
}
}
}
private void delete(String hbaseTableName, String columnFamily,
String qualifier, Collection<String> rowKeys) {
HTableInterface table = null;
try {
table = tablePool.getTable(hbaseTableName);
List<Delete> deleteList = new ArrayList<Delete>();
int idx = 0;
for (String r : rowKeys) {
Delete del = new Delete(r.getBytes());
deleteList.add(del);
if (deleteList.size() >= BATCH_SIZE) {
table.delete(deleteList);
table.flushCommits();
deleteList.clear();
}
idx++;
}
table.delete(deleteList);
table.flushCommits();
LOG.info("deleted " + idx + " rows from HBase table. "
+ hbaseTableName);
} catch (Throwable e) {
LOG.error("delete from table: " + hbaseTableName, e);
} finally {
if (table != null) {
try {
table.close();
} catch (IOException e) {
LOG.error("close table error, delete from table: "
+ hbaseTableName, e);
}
}
}
}
public void writeQueryReport(String queryId, String reportJson) {
String keyPrefix = queryId;
write(QUERY_REPORT_TABLE, COLUMN_FAMILY, QUALIFIER, keyPrefix,
Arrays.asList(reportJson));
}
private String getFirst(Collection<String> list) {
for (String s : list) {
return s;
}
return null;
}
public String getQueryReport(String queryId) {
String keyPrefix = queryId;
Collection<String> data = read(QUERY_REPORT_TABLE, COLUMN_FAMILY, QUALIFIER,
keyPrefix).values();
if (data == null || data.size() == 0)
return null;
else
return getFirst(data);
}
public String getAsyncQueryStatus(String queryId) {
String keyPrefix = queryId;
Collection<String> data = read(QUERY_STATUS_TABLE, COLUMN_FAMILY, QUALIFIER,
keyPrefix).values();
if (data == null || data.size() == 0)
return null;
else
return getFirst(data);
}
public void setAsyncQueryStatus(String queryId, String status) {
String keyPrefix = queryId;
write(QUERY_STATUS_TABLE, COLUMN_FAMILY, QUALIFIER, keyPrefix,
Arrays.asList(status));
}
public Collection<String> getConsoleLog(String shellJobId) {
String keyPrefix = "tryRun_" + shellJobId;
Map<String,String> map = read(CONSOLE_LOG_TABLE, COLUMN_FAMILY, QUALIFIER, keyPrefix);
delete(CONSOLE_LOG_TABLE, COLUMN_FAMILY, QUALIFIER, map.keySet());
return map.values();
}
public Collection<String> getQueryResult(String queryId) {
String keyPrefix = queryId;
Map<String,String> map = read(TRY_RUN_RESULT_TABLE, COLUMN_FAMILY, QUALIFIER, keyPrefix);
delete(TRY_RUN_RESULT_TABLE, COLUMN_FAMILY, QUALIFIER, map.keySet());
return map.values();
}
}