/**
* 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.hive.ql.exec.tez.monitoring;
import org.apache.hadoop.hive.ql.log.PerfLogger;
import org.apache.hadoop.hive.ql.session.SessionState;
import java.text.DecimalFormat;
import static org.apache.hadoop.hive.ql.exec.tez.monitoring.Constants.SEPARATOR;
class QueryExecutionBreakdownSummary implements PrintSummary {
// Methods summary
private static final String OPERATION_SUMMARY = "%-35s %9s";
private static final String OPERATION = "OPERATION";
private static final String DURATION = "DURATION";
private DecimalFormat decimalFormat = new DecimalFormat("#0.00");
private PerfLogger perfLogger;
private final Long compileEndTime;
private final Long dagSubmitStartTime;
private final Long submitToRunningDuration;
QueryExecutionBreakdownSummary(PerfLogger perfLogger) {
this.perfLogger = perfLogger;
this.compileEndTime = perfLogger.getEndTime(PerfLogger.COMPILE);
this.dagSubmitStartTime = perfLogger.getStartTime(PerfLogger.TEZ_SUBMIT_DAG);
this.submitToRunningDuration = perfLogger.getDuration(PerfLogger.TEZ_SUBMIT_TO_RUNNING);
}
private String formatNumber(long number) {
return decimalFormat.format(number / 1000.0) + "s";
}
private String format(String value, long number) {
return String.format(OPERATION_SUMMARY, value, formatNumber(number));
}
public void print(SessionState.LogHelper console) {
console.printInfo("Query Execution Summary");
String execBreakdownHeader = String.format(OPERATION_SUMMARY, OPERATION, DURATION);
console.printInfo(SEPARATOR);
console.printInfo(execBreakdownHeader);
console.printInfo(SEPARATOR);
// parse, analyze, optimize and compile
long compile = compileEndTime - perfLogger.getStartTime(PerfLogger.COMPILE);
console.printInfo(format("Compile Query", compile));
// prepare plan for submission (building DAG, adding resources, creating scratch dirs etc.)
long totalDAGPrep = dagSubmitStartTime - compileEndTime;
console.printInfo(format("Prepare Plan", totalDAGPrep));
// submit to accept dag (if session is closed, this will include re-opening of session time,
// localizing files for AM, submitting DAG)
long submitToAccept = perfLogger.getStartTime(PerfLogger.TEZ_RUN_DAG) - dagSubmitStartTime;
console.printInfo(format("Submit Plan", submitToAccept));
// accept to start dag (schedule wait time, resource wait time etc.)
console.printInfo(format("Start DAG", submitToRunningDuration));
// time to actually run the dag (actual dag runtime)
final long startToEnd;
if (submitToRunningDuration == 0) {
startToEnd = perfLogger.getDuration(PerfLogger.TEZ_RUN_DAG);
} else {
startToEnd = perfLogger.getEndTime(PerfLogger.TEZ_RUN_DAG) -
perfLogger.getEndTime(PerfLogger.TEZ_SUBMIT_TO_RUNNING);
}
console.printInfo(format("Run DAG", startToEnd));
console.printInfo(SEPARATOR);
console.printInfo("");
}
}