@Override public void analyze(DagInfo dagInfo) throws TezException { // get all attempts in the dag and find the last failed/succeeded attempt. // ignore killed attempt to handle kills that happen upon dag completion TaskAttemptInfo lastAttempt = null; long lastAttemptFinishTime = 0; for (VertexInfo vertex : dagInfo.getVertices()) { for (TaskInfo task : vertex.getTasks()) { for (TaskAttemptInfo attempt : task.getTaskAttempts()) { attempts.put(attempt.getTaskAttemptId(), attempt); if (attempt.getStatus().equals(succeededState) || attempt.getStatus().equals(failedState)) { if (lastAttemptFinishTime < attempt.getFinishTime()) { lastAttempt = attempt; lastAttemptFinishTime = attempt.getFinishTime(); } } } } } if (lastAttempt == null) { System.out.println("Cannot find last attempt to finish in DAG " + dagInfo.getDagId()); return; } createCriticalPath(dagInfo, lastAttempt, lastAttemptFinishTime, attempts); analyzeCriticalPath(dagInfo); if (getConf().getBoolean(DRAW_SVG, true)) { saveCriticalPathAsSVG(dagInfo); } }
private void analyzeAllocationOverhead(DagInfo dag) { List<TaskAttemptInfo> preemptedAttempts = Lists.newArrayList(); for (VertexInfo v : dag.getVertices()) { for (TaskInfo t : v.getTasks()) { for (TaskAttemptInfo a : t.getTaskAttempts()) { if (a.getTerminationCause() .equals(TaskAttemptTerminationCause.INTERNAL_PREEMPTION.name())) { System.out.println("Found preempted attempt " + a.getTaskAttemptId()); preemptedAttempts.add(a); } } } } for (int i = 0; i < criticalPath.size(); ++i) { CriticalPathStep step = criticalPath.get(i); TaskAttemptInfo attempt = step.attempt; if (step.getType() != EntityType.ATTEMPT) { continue; } long creationTime = attempt.getCreationTime(); long allocationTime = attempt.getAllocationTime(); if (allocationTime < step.startCriticalPathTime) { // allocated before it became critical continue; } // the attempt is critical before allocation. So allocation overhead needs analysis Container container = attempt.getContainer(); if (container != null) { Collection<TaskAttemptInfo> attempts = dag.getContainerMapping().get(container); if (attempts != null && !attempts.isEmpty()) { // arrange attempts by allocation time List<TaskAttemptInfo> attemptsList = Lists.newArrayList(attempts); Collections.sort(attemptsList, TaskAttemptInfo.orderingOnAllocationTime()); // walk the list to record allocation time before the current attempt long containerPreviousAllocatedTime = 0; for (TaskAttemptInfo containerAttempt : attemptsList) { if (containerAttempt.getTaskAttemptId().equals(attempt.getTaskAttemptId())) { break; } System.out.println( "Container: " + container.getId() + " running att: " + containerAttempt.getTaskAttemptId() + " wait att: " + attempt.getTaskAttemptId()); containerPreviousAllocatedTime += containerAttempt.getAllocationToEndTimeInterval(); } if (containerPreviousAllocatedTime == 0) { step.notes.add("Container " + container.getId() + " newly allocated."); } else { if (containerPreviousAllocatedTime >= attempt.getCreationToAllocationTimeInterval()) { step.notes.add("Container " + container.getId() + " was fully allocated"); } else { step.notes.add( "Container " + container.getId() + " allocated for " + SVGUtils.getTimeStr(containerPreviousAllocatedTime) + " out of " + SVGUtils.getTimeStr(attempt.getCreationToAllocationTimeInterval()) + " of allocation wait time"); } } } // look for internal preemptions while attempt was waiting for allocation for (TaskAttemptInfo a : preemptedAttempts) { if (a.getFinishTime() > creationTime && a.getFinishTime() < allocationTime) { // found an attempt that was preempted within this time interval step.notes.add("Potentially waited for preemption of " + a.getShortName()); } } } } }