Package com.splout.db.examples

Source Code of com.splout.db.examples.MeteoBenchmark

package com.splout.db.examples;

/*
* #%L
* Splout SQL Hadoop library
* %%
* Copyright (C) 2012 Datasalt Systems S.L.
* %%
* Licensed 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.
* #L%
*/

import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.ParameterException;
import com.splout.db.benchmark.SploutBenchmark;
import com.splout.db.benchmark.SploutBenchmark.StressThreadImpl;
import com.splout.db.common.SploutClient;
import com.splout.db.qnode.beans.QueryStatus;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
* A benchmark designed ot stress-test Splout with the meteorogical dataset you can find on examples/meteo. Each thread
* will launch an aggregation by day or month (depending on configuration) selecting randomly the station between
* existing ones.
*/
public class MeteoBenchmark {

  @Parameter(required = true, names = { "-q", "--qnodes" }, description = "Comma-separated list QNode addresses.")
  private String qNodes;

  @Parameter(names = { "-n", "--niterations" }, description = "The number of iterations for running the benchmark more than once.")
  private Integer nIterations = 1;

  @Parameter(names = { "-nth", "--nthreads" }, description = "The number of threads to use for the test.")
  private Integer nThreads = 1;

  @Parameter(required = true, names = { "-nq", "--nqueries" }, description = "The number of queries to perform for the benchmark.")
  private Integer nQueries;

  @Parameter(required = false, names = { "-m", "--month" }, description = "Perform month queries instead of day ones.")
  private boolean monthQueries = false;

  public void start() throws InterruptedException {
    Map<String, Object> context = new HashMap<String, Object>();
    context.put("qnodes", qNodes);
    context.put("month", monthQueries + "");
    SploutBenchmark benchmark = new SploutBenchmark();
    for(int i = 0; i < nIterations; i++) {
      benchmark.stressTest(nThreads, nQueries, MeteoStressThreadImpl.class, context);
      benchmark.printStats(System.out);
    }
  }

  /**
   * Stress thread implementation following convention from {@link com.splout.db.benchmark.SploutBenchmark}.
   */
  public static class MeteoStressThreadImpl extends StressThreadImpl {

    SploutClient client;
    final String tablespace = "meteo-pby-stn-wban";

    ArrayList<Map<String, Integer>> stations;
    Random rand = new Random();

    Map<String, Object> context;

    @SuppressWarnings("unchecked")
    @Override
    public void init(Map<String, Object> context) throws Exception {
      this.context = context;
      client = new SploutClient(20*1000, ((String)context.get("qnodes")).split(","));
      String query = "SELECT stn, wban FROM stations";
      System.out.println("Retrieving stations list");
      long statTime = System.currentTimeMillis();
      QueryStatus st = client.query(tablespace, "any", query, null);
      if(st.getResult() == null) {
        throw new RuntimeException("Impossible to retrieve stations list. " + st);
      }
      stations = st.getResult();
      System.out.println("Loaded " + stations.size() + " stations in "
          + (System.currentTimeMillis() - statTime) + " ms.");
    }

    @Override
    public int nextQuery() throws Exception {
        int rndIdx = rand.nextInt(stations.size());
        int stn = stations.get(rndIdx).get("stn");
        int wban = stations.get(rndIdx).get("wban");
        String query;
        if(context.get("month").equals("false")) {
          query = "select year,month,day,min,max from meteo where stn=" + stn + " and wban = " + wban
              + " order by year,month,day";
        } else {
          query = "select year,month,min(min) as min,max(max) as max from meteo where stn=" + stn
              + " and wban=" + wban + " group by year,month order by year,month";
        }

        QueryStatus st = client.query(tablespace, stn + "" + wban, query, null);
        if(st.getResult() != null) {
          return st.getResult().size();
        } else {
          return 0;
        }
    }
  }

  public static void main(String[] args) throws InterruptedException {
    MeteoBenchmark benchmarkTool = new MeteoBenchmark();

    JCommander jComm = new JCommander(benchmarkTool);
    jComm.setProgramName("Meteo Benchmark Tool");
    try {
      jComm.parse(args);
    } catch(ParameterException e) {
      System.out.println(e.getMessage());
      System.out.println();
      jComm.usage();
      System.exit(-1);
    } catch(Throwable t) {
      t.printStackTrace();
      jComm.usage();
      System.exit(-1);
    }

    benchmarkTool.start();
    System.exit(0);
  }
}
TOP

Related Classes of com.splout.db.examples.MeteoBenchmark

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.