private Set<String> calcFetchCounterAndAttemptTaskId(List<MRTask> tasks) {
Set<String> needFetchAttemptTasks = new HashSet<>();
Comparator<MRTask> byElapsedTimeIncrease = (e1, e2) -> Long.compare(e1.getElapsedTime(), e2.getElapsedTime());
Comparator<MRTask> byElapsedTimeDecrease = (e1, e2) -> -1 * Long.compare(e1.getElapsedTime(), e2.getElapsedTime());
Iterator<MRTask> taskIteratorIncrease = tasks.stream()
.filter(task -> task.getState().equals(Constants.TaskState.SUCCEEDED.toString()))
.sorted(byElapsedTimeIncrease).iterator();
needFetchAttemptTasks(taskIteratorIncrease, needFetchAttemptTasks);
Iterator<MRTask> taskIteratorDecrease = tasks.stream()
.filter(task -> task.getState().equals(Constants.TaskState.SUCCEEDED.toString()))
.sorted(byElapsedTimeDecrease).iterator();
needFetchAttemptTasks(taskIteratorDecrease, needFetchAttemptTasks);
taskIteratorDecrease = tasks.stream()
.filter(task -> task.getState().equals(Constants.TaskState.RUNNING.toString()))
.sorted(byElapsedTimeDecrease).iterator();
needFetchAttemptTasks(taskIteratorDecrease, needFetchAttemptTasks);
return needFetchAttemptTasks;
}