blob: aa8e27bc53833b95b6b34684c07e3749c9eecb40 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.accumulo.testing.core.merkle.ingest;
import java.util.Random;
import org.apache.accumulo.core.cli.BatchWriterOpts;
import org.apache.accumulo.core.cli.ClientOnDefaultTable;
import org.apache.accumulo.core.client.AccumuloClient;
import org.apache.accumulo.core.client.BatchWriter;
import org.apache.accumulo.core.client.BatchWriterConfig;
import org.apache.accumulo.core.data.Mutation;
import org.apache.accumulo.core.data.Value;
import org.apache.hadoop.io.Text;
import com.beust.jcommander.Parameter;
/**
* Generates some random data with a given percent of updates to be deletes.
*/
public class RandomWorkload {
public static final String DEFAULT_TABLE_NAME = "randomWorkload";
public static class RandomWorkloadOpts extends ClientOnDefaultTable {
@Parameter(names = {"-n", "--num"}, required = true, description = "Num records to write")
public long numRecords;
@Parameter(names = {"-r", "--rows"}, required = true, description = "Range of rows that can be generated")
public int rowMax;
@Parameter(names = {"-cf", "--colfams"}, required = true, description = "Range of column families that can be generated")
public int cfMax;
@Parameter(names = {"-cq", "--colquals"}, required = true, description = "Range of column qualifiers that can be generated")
public int cqMax;
@Parameter(names = {"-d", "--deletes"}, required = false, description = "Percentage of updates that should be deletes")
public int deletePercent = 5;
public RandomWorkloadOpts() {
super(DEFAULT_TABLE_NAME);
}
public RandomWorkloadOpts(String tableName) {
super(tableName);
}
}
public void run(RandomWorkloadOpts opts, BatchWriterConfig cfg) throws Exception {
run(opts.getClient(), opts.getTableName(), cfg, opts.numRecords, opts.rowMax, opts.cfMax, opts.cqMax, opts.deletePercent);
}
public void run(final AccumuloClient client, final String tableName, final BatchWriterConfig cfg, final long numRecords, int rowMax, int cfMax, int cqMax,
int deletePercent) throws Exception {
final Random rowRand = new Random(12345);
final Random cfRand = new Random(12346);
final Random cqRand = new Random(12347);
final Random deleteRand = new Random(12348);
long valueCounter = 0l;
if (!client.tableOperations().exists(tableName)) {
client.tableOperations().create(tableName);
}
BatchWriter bw = client.createBatchWriter(tableName, cfg);
try {
final Text row = new Text(), cf = new Text(), cq = new Text();
final Value value = new Value();
for (long i = 0; i < numRecords; i++) {
row.set(Integer.toString(rowRand.nextInt(rowMax)));
cf.set(Integer.toString(cfRand.nextInt(cfMax)));
cq.set(Integer.toString(cqRand.nextInt(cqMax)));
Mutation m = new Mutation(row);
// Choose a random value between [0,100)
int deleteValue = deleteRand.nextInt(100);
// putDelete if the value we chose is less than our delete
// percentage
if (deleteValue < deletePercent) {
m.putDelete(cf, cq);
} else {
value.set(Long.toString(valueCounter).getBytes());
m.put(cf, cq, valueCounter, value);
}
bw.addMutation(m);
valueCounter++;
}
} finally {
bw.close();
}
}
public static void main(String[] args) throws Exception {
RandomWorkloadOpts opts = new RandomWorkloadOpts();
BatchWriterOpts bwOpts = new BatchWriterOpts();
opts.parseArgs(RandomWorkload.class.getSimpleName(), args, bwOpts);
RandomWorkload rw = new RandomWorkload();
rw.run(opts, bwOpts.getBatchWriterConfig());
}
}