HbaseUtils,HBase Java Api

 

 

 

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();
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值