/*
* 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.
*/
package org.apache.hadoop.hive.llap.daemon.impl.comparator;
import java.util.Comparator;
import org.apache.hadoop.hive.llap.daemon.impl.TaskExecutorService.TaskWrapper;
import org.apache.hadoop.hive.llap.daemon.impl.TaskRunnerCallable;
import org.apache.hadoop.hive.llap.daemon.rpc.LlapDaemonProtocolProtos;
// if map tasks and reduce tasks are in finishable state then priority is given to the task in
// the following order
// 1) Dag start time
// 2) Within dag priority
// 3) Attempt start time
// 4) Vertex parallelism
public class FirstInFirstOutComparator implements Comparator<TaskWrapper> {
@Override
public int compare(TaskWrapper t1, TaskWrapper t2) {
TaskRunnerCallable o1 = t1.getTaskRunnerCallable();
TaskRunnerCallable o2 = t2.getTaskRunnerCallable();
boolean o1CanFinish = o1.canFinish();
boolean o2CanFinish = o2.canFinish();
if (o1CanFinish == true && o2CanFinish == false) {
return -1;
} else if (o1CanFinish == false && o2CanFinish == true) {
return 1;
}
LlapDaemonProtocolProtos.FragmentRuntimeInfo fri1 = o1.getFragmentRuntimeInfo();
LlapDaemonProtocolProtos.FragmentRuntimeInfo fri2 = o2.getFragmentRuntimeInfo();
if (fri1.getDagStartTime() < fri2.getDagStartTime()) {
return -1;
} else if (fri1.getDagStartTime() > fri2.getDagStartTime()) {
return 1;
}
// Check if these belong to the same task, and work with withinDagPriority
if (o1.getQueryId().equals(o2.getQueryId())) {
// Same Query
// Within dag priority - lower values indicate higher priority.
return Integer.compare(fri1.getWithinDagPriority(), fri2.getWithinDagPriority());
}
if (fri1.getFirstAttemptStartTime() < fri2.getFirstAttemptStartTime()) {
return -1;
} else if (fri1.getFirstAttemptStartTime() > fri2.getFirstAttemptStartTime()) {
return 1;
}
// Compute knownPending tasks. selfAndUpstream indicates task counts for current vertex and
// it's parent hierarchy. selfAndUpstreamComplete indicates how many of these have completed.
int knownPending1 = fri1.getNumSelfAndUpstreamTasks() - fri1.getNumSelfAndUpstreamCompletedTasks();
int knownPending2 = fri2.getNumSelfAndUpstreamTasks() - fri2.getNumSelfAndUpstreamCompletedTasks();
if (knownPending1 < knownPending2) {
return -1;
} else if (knownPending1 > knownPending2) {
return 1;
}
return 0;
}
}