package org.apache.cassandra.hadoop2.multiquery; import java.util.ArrayList; import java.util.List; import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.collect.Lists; import org.apache.commons.lang3.SerializationUtils; import org.apache.commons.net.util.Base64; import org.apache.hadoop.conf.Configuration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ConfigHelper { private static final Logger LOG = LoggerFactory.getLogger(ConfigHelper.class); /** This is just a static utility class. */ private ConfigHelper() { throw new AssertionError(); } // ----------------------------------------------------------------------------------------------- // Stuff for keeping track of different CQL queries. private static final String INPUT_CQL_QUERY_COUNTER = "cassandra.input.query.count"; private static final String INPUT_CQL_QUERY_QUERY = "cassandra.input.query.query"; public static void setInputCqlQuery(Configuration conf, CqlQuerySpec query) { Preconditions.checkNotNull(conf); // Get the current query count and increment it. int currentQueryCount = conf.getInt(INPUT_CQL_QUERY_COUNTER, 0); conf.setInt(INPUT_CQL_QUERY_COUNTER, currentQueryCount+1); String queryIndex = Integer.toString(currentQueryCount); // Serialize the query. final String serializedRequest = Base64.encodeBase64String(SerializationUtils.serialize(query)); conf.set(INPUT_CQL_QUERY_QUERY + queryIndex, serializedRequest); } public static List<CqlQuerySpec> getInputCqlQueries(Configuration conf) { Preconditions.checkNotNull(conf); List<CqlQuerySpec> queries = Lists.newArrayList(); for (int i = 0; i < conf.getInt(INPUT_CQL_QUERY_COUNTER, 0); i++) { String serializedQuery = conf.get(INPUT_CQL_QUERY_QUERY + i); Preconditions.checkNotNull(serializedQuery); CqlQuerySpec query = SerializationUtils.deserialize(Base64.decodeBase64(serializedQuery)); queries.add(query); } return queries; } // ----------------------------------------------------------------------------------------------- // We allow you to specify additional columns (beyond the partition key) to use for grouping // together rows. private static final String INPUT_CQL_QUERY_CLUSTERING_COLUMNS = "cassandra.input.query.clustering.columns"; public static void setInputCqlQueryClusteringColumns(Configuration conf, String... columns) { Preconditions.checkNotNull(conf); String columnCsv = Joiner.on(",").join(columns); LOG.info("Setting clustering columns " + columnCsv); conf.set(INPUT_CQL_QUERY_CLUSTERING_COLUMNS, columnCsv); } public static List<String> getInputCqlQueryClusteringColumns(Configuration conf) { Preconditions.checkNotNull(conf); String csv = conf.get(INPUT_CQL_QUERY_CLUSTERING_COLUMNS, null); if (null == csv) { return new ArrayList<String>(); } return Splitter.on(",").splitToList(csv); } // ----------------------------------------------------------------------------------------------- // Everything else. private static final String INPUT_CQL_PAGE_ROW_SIZE = "cassandra.input.page.row.size"; private static final int DEFAULT_INPUT_CQL_PAGE_ROW_SIZE = 100; private static final String INPUT_NATIVE_TRANSPORT_PORT = "cassandra.input.native.port"; private static final int DEFAULT_INPUT_NATIVE_TRANSPORT_PORT = 9042; private static final String INPUT_NATIVE_TRANSPORT_CONTACT_POINTS = "cassandra.input.native.contacts"; private static final String DEFAULT_INPUT_NATIVE_TRANSPORT_CONTACT_POINT = "127.0.0.1"; private static final String INPUT_TARGET_NUM_SPLITS = "cassandra.input.num_splits"; private static final int DEFAULT_INPUT_TARGET_NUM_SPLITS = 1; // TODO: keyspace, consistency level public static void setInputCqlPageRowSize(Configuration conf, int pageRowSize) { Preconditions.checkNotNull(conf); conf.setInt(INPUT_CQL_PAGE_ROW_SIZE, pageRowSize); } public static int getInputCqlPageRowSize(Configuration conf) { Preconditions.checkNotNull(conf); return conf.getInt(INPUT_CQL_PAGE_ROW_SIZE, DEFAULT_INPUT_CQL_PAGE_ROW_SIZE); } public static void setInputNativeTransportPort(Configuration conf, int port) { Preconditions.checkNotNull(conf); conf.setInt(INPUT_NATIVE_TRANSPORT_PORT, port); } public static int getInputNativeTransportPort(Configuration conf) { Preconditions.checkNotNull(conf); return conf.getInt(INPUT_NATIVE_TRANSPORT_PORT, DEFAULT_INPUT_NATIVE_TRANSPORT_PORT); } public static void setInputNativeTransportContactPoints(Configuration conf, String... contacts) { Preconditions.checkNotNull(conf); Preconditions.checkArgument(contacts.length> 0); for (String contact : contacts) { Preconditions.checkNotNull(contact); } conf.setStrings(INPUT_NATIVE_TRANSPORT_CONTACT_POINTS, contacts); } public static String[] getInputNativeTransportContactPoints(Configuration conf) { Preconditions.checkNotNull(conf); String[] contacts = conf.getStrings(INPUT_NATIVE_TRANSPORT_CONTACT_POINTS); if (null != contacts && contacts.length > 0) { return contacts; } return new String[] {DEFAULT_INPUT_NATIVE_TRANSPORT_CONTACT_POINT}; } public static void setInputTargetNumSplits(Configuration conf, int numSplits) { Preconditions.checkNotNull(conf); conf.setInt(INPUT_TARGET_NUM_SPLITS, numSplits); } public static int getDefaultInputTargetNumSplits(Configuration conf) { Preconditions.checkNotNull(conf); return conf.getInt(INPUT_TARGET_NUM_SPLITS, DEFAULT_INPUT_TARGET_NUM_SPLITS); } }