package net.hbase.secondaryindex.util;
import java.io.IOException;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.regionserver.StoreFile;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.util.GenericOptionsParser;
public class PreRegionsCreation {
static final Log LOG = LogFactory.getLog(PreRegionsCreation.class);
public static final String NAME = "Pre-Region-Creation";
public int NUM_REGIONSERVERS;
public static final String DEFAULT_START_KEY = "0";
public static final String DEFAULT_END_KEY = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
public Configuration config;
public HBaseAdmin admin;
ConfigProperties cp = ConfigFactory.getInstance().getConfigProperties(
ConfigFactory.INDEX_CONFIG_PATH);
public PreRegionsCreation() {
config = HBaseConfiguration.create();
config.set(ConfigProperties.CONFIG_NAME_HBASE_MASTER,
cp.getProperty(ConfigProperties.CONFIG_NAME_HBASE_MASTER));
config.set(
ConfigProperties.CONFIG_NAME_HBASE_ZOOKEEPER_PROPRERTY_CLIENTPORT,
cp.getProperty(ConfigProperties.CONFIG_NAME_HBASE_ZOOKEEPER_PROPRERTY_CLIENTPORT));
config.set(
ConfigProperties.CONFIG_NAME_HBASE_ZOOKEEPER_QUORUM,
cp.getProperty(ConfigProperties.CONFIG_NAME_HBASE_ZOOKEEPER_QUORUM));
// double number of regionserver
NUM_REGIONSERVERS = 2 * cp.getInt(
ConfigProperties.CONFIG_NAME_HBASE_REGIONSERVER_NUM, 1);
try {
admin = new HBaseAdmin(config);
} catch (IOException e) {
e.printStackTrace();
}
}
public void create(String tableName, String[] columnFamily,
String startKey, String endKey) throws IOException {
HTableDescriptor desc = new HTableDescriptor(Bytes.toBytes(tableName));
for (String cf : columnFamily) {
HColumnDescriptor cfDesc = new HColumnDescriptor(cf);
// column family attribute
cfDesc.setValue(HConstants.VERSIONS,
String.valueOf(Integer.MAX_VALUE));
cfDesc.setValue(HColumnDescriptor.BLOOMFILTER,
StoreFile.BloomType.ROW.toString());
desc.addFamily(cfDesc);
}
if (!admin.tableExists(tableName)) {
if (null != startKey && null != endKey)
admin.createTable(desc, Bytes.toBytes(startKey),
Bytes.toBytes(endKey), NUM_REGIONSERVERS);
}
}
public void create(String tableName, String[] columnFamily)
throws IOException {
create(tableName, columnFamily, DEFAULT_START_KEY, DEFAULT_END_KEY);
}
public static void main(String[] args) throws IOException, ParseException {
Configuration conf = HBaseConfiguration.create();
String[] otherArgs = new GenericOptionsParser(conf, args)
.getRemainingArgs();
CommandLine cmd = parseArgs(otherArgs);
String indexTable = cmd.getOptionValue("i");
String columns = cmd.getOptionValue("c");
String startKey = cmd.getOptionValue("s");
String endKey = cmd.getOptionValue("e");
PreRegionsCreation pc = new PreRegionsCreation();
String[] cfs = columns.split(",");
if (null != startKey && null != endKey)
pc.create(indexTable, cfs, startKey, endKey);
else
pc.create(indexTable, cfs);
}
private static CommandLine parseArgs(String[] args) throws ParseException {
Options options = new Options();
Option o = new Option("i", "indexTable", true,
"the directory or file to read from (must exist)");
o.setArgName("input-table-name");
o.setRequired(true);
options.addOption(o);
o = new Option(
"c",
"column",
true,
"column to store row data into (must exist). Such as: cf1:age,cf2:tag,cf2:msg or rowkey or rowkey,cf1:age. The last two usage are for 'rowkey' index building.");
o.setArgName("family:qualifier");
o.setRequired(true);
options.addOption(o);
o = new Option("s", "startKey", true,
"the start date of data to build index(default is 19700101), such as: 20130101");
o.setArgName("start-date");
o.setRequired(false);
options.addOption(o);
o = new Option("e", "endKey", true,
"the end date of data to build index(default is today), such as: 20130120");
o.setArgName("end-date");
o.setRequired(false);
options.addOption(o);
CommandLineParser parser = new PosixParser();
CommandLine cmd = null;
try {
cmd = parser.parse(options, args);
} catch (Exception e) {
System.err.println("ERROR: " + e.getMessage() + "\n");
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp(NAME + " ", options, true);
System.exit(-1);
}
return cmd;
}
}