blob: 2681f2369c7733211c2c3b2761371bc8a132b9ae [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.carbondata.core.stats;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.List;
import org.apache.carbondata.common.annotations.InterfaceAudience;
import org.apache.carbondata.common.annotations.InterfaceStability;
import org.apache.carbondata.core.util.CarbonUtil;
@InterfaceAudience.Developer("stats")
@InterfaceStability.Evolving
public class TaskStatistics implements Serializable {
private static final Column[] columns = {
new Column("query_id", "query id"),
new Column("task_id", "spark task id"),
new Column("start_time", "start time"),
new Column("total_time", QueryStatisticsConstants.EXECUTOR_PART, true),
new Column("load_blocks_time", QueryStatisticsConstants.LOAD_BLOCKS_EXECUTOR, true),
new Column("load_dictionary_time", QueryStatisticsConstants.LOAD_DICTIONARY, true),
new Column("carbon_scan_time", QueryStatisticsConstants.SCAN_BLOCKlET_TIME),
new Column("carbon_IO_time", QueryStatisticsConstants.READ_BLOCKlET_TIME),
new Column("scan_blocks_num", QueryStatisticsConstants.SCAN_BLOCKS_NUM),
new Column("total_blocklets", QueryStatisticsConstants.TOTAL_BLOCKLET_NUM),
new Column("scanned_blocklets", QueryStatisticsConstants.BLOCKLET_SCANNED_NUM),
new Column("valid_blocklets", QueryStatisticsConstants.VALID_SCAN_BLOCKLET_NUM),
new Column("total_pages", QueryStatisticsConstants.TOTAL_PAGE_SCANNED),
new Column("scanned_pages", QueryStatisticsConstants.PAGE_SCANNED),
new Column("valid_pages", QueryStatisticsConstants.VALID_PAGE_SCANNED),
new Column("result_size", QueryStatisticsConstants.RESULT_SIZE),
new Column("key_column_filling_time", QueryStatisticsConstants.KEY_COLUMN_FILLING_TIME),
new Column("measure_filling_time", QueryStatisticsConstants.MEASURE_FILLING_TIME),
new Column("page_uncompress_time", QueryStatisticsConstants.PAGE_UNCOMPRESS_TIME),
new Column("result_preparation_time", QueryStatisticsConstants.RESULT_PREP_TIME)
};
private static final int numOfColumns = columns.length;
private String queryId;
private long[] values = new long[numOfColumns];
private long fileSize;
private String[] files;
TaskStatistics(String queryId, long taskId) {
this.queryId = queryId;
this.values[1] = taskId;
}
public TaskStatistics(String queryId, long[] values, long fileSize, String[] files) {
this.queryId = queryId;
this.values = values;
this.fileSize = fileSize;
this.files = files;
}
public TaskStatistics build(long startTime, List<QueryStatistic> queryStatistics) {
this.values[2] = startTime;
for (QueryStatistic statistic : queryStatistics) {
if (statistic.getMessage() != null) {
for (int columnIndex = 3; columnIndex <= numOfColumns - 1; columnIndex++) {
if (columns[columnIndex].comment.equals(statistic.getMessage())) {
if (columns[columnIndex].isDuration) {
values[columnIndex] += statistic.getTimeTaken();
} else {
values[columnIndex] += statistic.getCount();
}
break;
}
}
}
}
return this;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
printStatisticTable(Arrays.asList(this), builder, "");
return builder.toString();
}
public static void printStatisticTable(List<TaskStatistics> stats, StringBuilder builder,
String indent) {
int numOfRows = stats.size();
int numOfColumns = columns.length;
// header as string[]
String[] header = new String[numOfColumns];
for (int columnIndex = 0; columnIndex < numOfColumns; columnIndex++) {
header[columnIndex] = columns[columnIndex].name;
}
// convert rows to string[][]
String[][] rows = new String[numOfRows][];
for (int rowIndex = 0; rowIndex < numOfRows; rowIndex++) {
rows[rowIndex] = stats.get(rowIndex).convertValueToString();
}
CarbonUtil.logTable(builder, header, rows, indent);
}
private String[] convertValueToString() {
String[] valueStrings = new String[numOfColumns];
valueStrings[0] = queryId;
for (int i = 1; i < numOfColumns; i++) {
if (columns[i].isDuration) {
valueStrings[i] = String.valueOf(values[i]) + "ms";
} else {
valueStrings[i] = String.valueOf(values[i]);
}
}
valueStrings[2] = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(values[2]);
return valueStrings;
}
private static class Column {
String name;
String comment;
boolean isDuration;
Column(String name, String comment) {
this.name = name;
this.comment = comment;
this.isDuration = false;
}
Column(String name, String comment, boolean isDuration) {
this(name, comment);
this.isDuration = isDuration;
}
}
public String getQueryId() {
return queryId;
}
public long[] getValues() {
return values;
}
public long getFileSize() {
return fileSize;
}
public String[] getFiles() {
return files;
}
}