org.apache.hadoop.chukwa.database.Aggregator.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.hadoop.chukwa.database.Aggregator.java

Source

/*
 * 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.hadoop.chukwa.database;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.sql.DatabaseMetaData;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.chukwa.inputtools.mdl.DataConfig;
import org.apache.hadoop.chukwa.util.DatabaseWriter;
import org.apache.hadoop.chukwa.util.ExceptionUtil;
import org.apache.hadoop.chukwa.util.PidFile;

@SuppressWarnings("unused")
public class Aggregator {

    private static Log log = LogFactory.getLog(Aggregator.class);
    private String table = null;
    private String jdbc = null;
    private int[] intervals;
    private long current = 0;
    private static DatabaseWriter db = null;

    public Aggregator() {
        Calendar now = Calendar.getInstance();
        current = now.getTimeInMillis();
    }

    public static String getContents(File aFile) {
        StringBuffer contents = new StringBuffer();
        try {
            BufferedReader input = new BufferedReader(new FileReader(aFile));
            try {
                String line = null; // not declared within while loop
                while ((line = input.readLine()) != null) {
                    contents.append(line);
                    contents.append(System.getProperty("line.separator"));
                }
            } finally {
                input.close();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return contents.toString();
    }

    public void process(long start, long end, String query) throws Throwable {
        try {
            Macro macroProcessor = new Macro(start, end, query);
            query = macroProcessor.toString();
            db.execute(query);
        } catch (Exception e) {
            log.error("Query: " + query);
            throw new Exception("Aggregation failed for: " + query);
        }
    }

    public void process(String query) throws Throwable {
        long start = current;
        long end = current;
        process(current, current, query);
    }

    public void setWriter(DatabaseWriter dbw) {
        db = dbw;
    }

    public static void main(String[] args) {
        long startTime = 0;
        long endTime = 0;
        long aggregatorStart = Calendar.getInstance().getTimeInMillis();
        long longest = 0;
        if (args.length >= 4) {
            ParsePosition pp = new ParsePosition(0);
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            String buffer = args[0] + " " + args[1];
            Date tmp = format.parse(buffer, pp);
            startTime = tmp.getTime();
            buffer = args[2] + " " + args[3];
            pp = new ParsePosition(0);
            tmp = format.parse(buffer, pp);
            endTime = tmp.getTime();
        }
        String longQuery = null;
        log.info("Aggregator started.");
        String cluster = System.getProperty("CLUSTER");
        if (cluster == null) {
            cluster = "unknown";
        }
        db = new DatabaseWriter(cluster);
        String queries = Aggregator
                .getContents(new File(System.getenv("CHUKWA_CONF_DIR") + File.separator + "aggregator.sql"));
        String[] query = queries.split("\n");
        while (startTime <= endTime) {
            for (int i = 0; i < query.length; i++) {
                if (query[i].equals("")) {
                } else if (query[i].indexOf("#") == 0) {
                    log.debug("skipping: " + query[i]);
                } else {
                    Aggregator dba = new Aggregator();
                    long start = Calendar.getInstance().getTimeInMillis();
                    try {
                        if (startTime != 0 && endTime != 0) {
                            dba.process(startTime, startTime, query[i]);
                        } else {
                            dba.process(query[i]);
                        }
                    } catch (Throwable e) {
                        log.error("Invalid query:" + query[i]);
                    }
                    long end = Calendar.getInstance().getTimeInMillis();
                    long duration = end - start;
                    if (duration >= longest) {
                        longest = duration;
                        longQuery = query[i];
                    }
                }
            }
            startTime = startTime + 5 * 60000;
        }
        db.close();
        long aggregatorEnd = Calendar.getInstance().getTimeInMillis();
        log.info("Longest running query: " + longQuery + " (" + (double) longest / 1000 + " seconds)");
        log.info("Total running time: (" + (double) (aggregatorEnd - aggregatorStart) / 1000 + " seconds)");
        log.info("Aggregator finished.");
    }

}