@SuppressWarnings("unchecked") public void sendTezEventToSourceTasks(TezEvent tezEvent) { if (!bufferEvents.get()) { switch (tezEvent.getEventType()) { case INPUT_READ_ERROR_EVENT: InputReadErrorEvent event = (InputReadErrorEvent) tezEvent.getEvent(); TezTaskAttemptID destAttemptId = tezEvent.getSourceInfo().getTaskAttemptID(); int destTaskIndex = destAttemptId.getTaskID().getId(); int srcTaskIndex = edgeManager.routeEventToSourceTasks(destTaskIndex, event); int numConsumers = edgeManager.getDestinationConsumerTaskNumber( srcTaskIndex, destinationVertex.getTotalTasks()); TezTaskID srcTaskId = sourceVertex.getTask(srcTaskIndex).getTaskId(); int taskAttemptIndex = event.getVersion(); TezTaskAttemptID srcTaskAttemptId = new TezTaskAttemptID(srcTaskId, taskAttemptIndex); eventHandler.handle( new TaskAttemptEventOutputFailed(srcTaskAttemptId, tezEvent, numConsumers)); break; default: throw new TezUncheckedException("Unhandled tez event type: " + tezEvent.getEventType()); } } else { sourceEventBuffer.add(tezEvent); } }
public InputSpec getDestinationSpec(int destinationTaskIndex) { return new InputSpec( sourceVertex.getName(), edgeProperty.getEdgeDestination(), edgeManager.getNumDestinationTaskInputs( sourceVertex.getTotalTasks(), destinationTaskIndex)); }
// TODO remove hacky name lookup @Override public boolean needsWaitAfterOutputConsumable() { Vertex vertex = getVertex(); ProcessorDescriptor processorDescriptor = vertex.getProcessorDescriptor(); if (processorDescriptor != null && processorDescriptor.getClassName().contains("InitialTaskWithInMemSort")) { return true; } else { return false; } }
@Test(timeout = 10000) public void testBasicSpeculationPerVertexConf() throws Exception { DAG dag = DAG.create("test"); String vNameNoSpec = "A"; String vNameSpec = "B"; Vertex vA = Vertex.create(vNameNoSpec, ProcessorDescriptor.create("Proc.class"), 5); Vertex vB = Vertex.create(vNameSpec, ProcessorDescriptor.create("Proc.class"), 5); vA.setConf(TezConfiguration.TEZ_AM_SPECULATION_ENABLED, "false"); dag.addVertex(vA); dag.addVertex(vB); // min/max src fraction is set to 1. So vertices will run sequentially dag.addEdge( Edge.create( vA, vB, EdgeProperty.create( DataMovementType.SCATTER_GATHER, DataSourceType.PERSISTED, SchedulingType.SEQUENTIAL, OutputDescriptor.create("O"), InputDescriptor.create("I")))); MockTezClient tezClient = createTezSession(); DAGClient dagClient = tezClient.submitDAG(dag); DAGImpl dagImpl = (DAGImpl) mockApp.getContext().getCurrentDAG(); TezVertexID vertexId = dagImpl.getVertex(vNameSpec).getVertexId(); TezVertexID vertexIdNoSpec = dagImpl.getVertex(vNameNoSpec).getVertexId(); // original attempt is killed and speculative one is successful TezTaskAttemptID killedTaId = TezTaskAttemptID.getInstance(TezTaskID.getInstance(vertexId, 0), 0); TezTaskAttemptID noSpecTaId = TezTaskAttemptID.getInstance(TezTaskID.getInstance(vertexIdNoSpec, 0), 0); // cause speculation trigger for both mockLauncher.setStatusUpdatesForTask(killedTaId, 100); mockLauncher.setStatusUpdatesForTask(noSpecTaId, 100); mockLauncher.startScheduling(true); dagClient.waitForCompletion(); Assert.assertEquals(DAGStatus.State.SUCCEEDED, dagClient.getDAGStatus(null).getState()); org.apache.tez.dag.app.dag.Vertex vSpec = dagImpl.getVertex(vertexId); org.apache.tez.dag.app.dag.Vertex vNoSpec = dagImpl.getVertex(vertexIdNoSpec); // speculation for vA but not for vB Assert.assertTrue( vSpec.getAllCounters().findCounter(TaskCounter.NUM_SPECULATIONS).getValue() > 0); Assert.assertEquals( 0, vNoSpec.getAllCounters().findCounter(TaskCounter.NUM_SPECULATIONS).getValue()); tezClient.stop(); }
public void sendTezEventToDestinationTasks(TezEvent tezEvent) { if (!bufferEvents.get()) { List<Integer> destTaskIndices = new ArrayList<Integer>(); boolean isDataMovementEvent = true; switch (tezEvent.getEventType()) { case INPUT_FAILED_EVENT: isDataMovementEvent = false; case DATA_MOVEMENT_EVENT: Event event = tezEvent.getEvent(); TezTaskAttemptID sourceAttemptId = tezEvent.getSourceInfo().getTaskAttemptID(); int sourceTaskIndex = sourceAttemptId.getTaskID().getId(); if (isDataMovementEvent) { edgeManager.routeEventToDestinationTasks( (DataMovementEvent) event, sourceTaskIndex, destinationVertex.getTotalTasks(), destTaskIndices); } else { edgeManager.routeEventToDestinationTasks( (InputFailedEvent) event, sourceTaskIndex, destinationVertex.getTotalTasks(), destTaskIndices); } for (Integer destTaskIndex : destTaskIndices) { EventMetaData destMeta = new EventMetaData( EventProducerConsumerType.INPUT, destinationVertex.getName(), sourceVertex.getName(), null); // will be filled by Task when sending the event. Is it needed? if (isDataMovementEvent) { destMeta.setIndex(((DataMovementEvent) event).getTargetIndex()); } else { destMeta.setIndex(((InputFailedEvent) event).getTargetIndex()); } tezEvent.setDestinationInfo(destMeta); TezTaskID destTaskId = destinationVertex.getTask(destTaskIndex).getTaskId(); sendEventToTask(destTaskId, tezEvent); } break; default: throw new TezUncheckedException("Unhandled tez event type: " + tezEvent.getEventType()); } } else { destinationEventBuffer.add(tezEvent); } }
public void testBasicSpeculation(boolean withProgress) throws Exception { DAG dag = DAG.create("test"); Vertex vA = Vertex.create("A", ProcessorDescriptor.create("Proc.class"), 5); dag.addVertex(vA); MockTezClient tezClient = createTezSession(); DAGClient dagClient = tezClient.submitDAG(dag); DAGImpl dagImpl = (DAGImpl) mockApp.getContext().getCurrentDAG(); TezVertexID vertexId = TezVertexID.getInstance(dagImpl.getID(), 0); // original attempt is killed and speculative one is successful TezTaskAttemptID killedTaId = TezTaskAttemptID.getInstance(TezTaskID.getInstance(vertexId, 0), 0); TezTaskAttemptID successTaId = TezTaskAttemptID.getInstance(TezTaskID.getInstance(vertexId, 0), 1); mockLauncher.updateProgress(withProgress); // cause speculation trigger mockLauncher.setStatusUpdatesForTask(killedTaId, 100); mockLauncher.startScheduling(true); dagClient.waitForCompletion(); Assert.assertEquals(DAGStatus.State.SUCCEEDED, dagClient.getDAGStatus(null).getState()); Task task = dagImpl.getTask(killedTaId.getTaskID()); Assert.assertEquals(2, task.getAttempts().size()); Assert.assertEquals(successTaId, task.getSuccessfulAttempt().getID()); TaskAttempt killedAttempt = task.getAttempt(killedTaId); Joiner.on(",").join(killedAttempt.getDiagnostics()).contains("Killed as speculative attempt"); Assert.assertEquals( TaskAttemptTerminationCause.TERMINATED_EFFECTIVE_SPECULATION, killedAttempt.getTerminationCause()); if (withProgress) { // without progress updates occasionally more than 1 task speculates Assert.assertEquals( 1, task.getCounters().findCounter(TaskCounter.NUM_SPECULATIONS).getValue()); Assert.assertEquals( 1, dagImpl.getAllCounters().findCounter(TaskCounter.NUM_SPECULATIONS).getValue()); org.apache.tez.dag.app.dag.Vertex v = dagImpl.getVertex(killedTaId.getTaskID().getVertexID()); Assert.assertEquals( 1, v.getAllCounters().findCounter(TaskCounter.NUM_SPECULATIONS).getValue()); } tezClient.stop(); }
@Test(timeout = 10000) public void testDAGSchedulerNaturalOrder() { DAG mockDag = mock(DAG.class); Vertex mockVertex = mock(Vertex.class); TaskAttempt mockAttempt = mock(TaskAttempt.class); when(mockDag.getVertex((TezVertexID) any())).thenReturn(mockVertex); when(mockVertex.getDistanceFromRoot()).thenReturn(0).thenReturn(1).thenReturn(2); when(mockAttempt.getIsRescheduled()).thenReturn(false); DAGEventSchedulerUpdate event = new DAGEventSchedulerUpdate(DAGEventSchedulerUpdate.UpdateType.TA_SCHEDULE, mockAttempt); DAGScheduler scheduler = new DAGSchedulerNaturalOrder(mockDag, mockEventHandler); scheduler.scheduleTask(event); Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 2); scheduler.scheduleTask(event); Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 4); scheduler.scheduleTask(event); Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 6); when(mockAttempt.getIsRescheduled()).thenReturn(true); scheduler.scheduleTask(event); Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 5); }
@Before public void setUp() { dispatcher = new DrainDispatcher(); dispatcher.register(DAGEventType.class, mock(EventHandler.class)); dispatcher.register(VertexEventType.class, mock(EventHandler.class)); dispatcher.register(TaskEventType.class, new TaskEventHandler()); dispatcher.register(TaskAttemptEventType.class, taEventHandler); dispatcher.init(new Configuration()); dispatcher.start(); vertex = mock(Vertex.class, RETURNS_DEEP_STUBS); when(vertex.getProcessorDescriptor().getClassName()).thenReturn(""); mockAppContext = mock(AppContext.class, RETURNS_DEEP_STUBS); when(mockAppContext.getCurrentDAG().getVertex(any(TezVertexID.class))).thenReturn(vertex); mockHistoryEventHandler = new MockHistoryEventHandler(mockAppContext); when(mockAppContext.getHistoryHandler()).thenReturn(mockHistoryEventHandler); task = new TaskImpl( vertexId, 0, dispatcher.getEventHandler(), new Configuration(), mock(TaskCommunicatorManagerInterface.class), new SystemClock(), mock(TaskHeartbeatHandler.class), mockAppContext, false, Resource.newInstance(1, 1), mock(ContainerContext.class), mock(StateChangeNotifier.class), vertex); Map<String, OutputCommitter> committers = new HashMap<String, OutputCommitter>(); committers.put( "out1", new TestOutputCommitter(mock(OutputCommitterContext.class), true, false)); when(task.getVertex().getOutputCommitters()).thenReturn(committers); }
@Ignore @Test(timeout = 10000) public void testDAGSchedulerMRR() { DAG mockDag = mock(DAG.class); TezDAGID dagId = TezDAGID.getInstance("1", 1, 1); TaskSchedulerEventHandler mockTaskScheduler = mock(TaskSchedulerEventHandler.class); Vertex mockVertex1 = mock(Vertex.class); TezVertexID mockVertexId1 = TezVertexID.getInstance(dagId, 1); when(mockVertex1.getVertexId()).thenReturn(mockVertexId1); when(mockVertex1.getDistanceFromRoot()).thenReturn(0); TaskAttempt mockAttempt1 = mock(TaskAttempt.class); when(mockAttempt1.getVertexID()).thenReturn(mockVertexId1); when(mockAttempt1.getIsRescheduled()).thenReturn(false); when(mockDag.getVertex(mockVertexId1)).thenReturn(mockVertex1); Vertex mockVertex2 = mock(Vertex.class); TezVertexID mockVertexId2 = TezVertexID.getInstance(dagId, 2); when(mockVertex2.getVertexId()).thenReturn(mockVertexId2); when(mockVertex2.getDistanceFromRoot()).thenReturn(1); TaskAttempt mockAttempt2 = mock(TaskAttempt.class); when(mockAttempt2.getVertexID()).thenReturn(mockVertexId2); when(mockAttempt2.getIsRescheduled()).thenReturn(false); when(mockDag.getVertex(mockVertexId2)).thenReturn(mockVertex2); TaskAttempt mockAttempt2f = mock(TaskAttempt.class); when(mockAttempt2f.getVertexID()).thenReturn(mockVertexId2); when(mockAttempt2f.getIsRescheduled()).thenReturn(true); Vertex mockVertex3 = mock(Vertex.class); TezVertexID mockVertexId3 = TezVertexID.getInstance(dagId, 3); when(mockVertex3.getVertexId()).thenReturn(mockVertexId3); when(mockVertex3.getDistanceFromRoot()).thenReturn(2); TaskAttempt mockAttempt3 = mock(TaskAttempt.class); when(mockAttempt3.getVertexID()).thenReturn(mockVertexId3); when(mockAttempt3.getIsRescheduled()).thenReturn(false); when(mockDag.getVertex(mockVertexId3)).thenReturn(mockVertex3); DAGEventSchedulerUpdate mockEvent1 = mock(DAGEventSchedulerUpdate.class); when(mockEvent1.getAttempt()).thenReturn(mockAttempt1); DAGEventSchedulerUpdate mockEvent2 = mock(DAGEventSchedulerUpdate.class); when(mockEvent2.getAttempt()).thenReturn(mockAttempt2); DAGEventSchedulerUpdate mockEvent2f = mock(DAGEventSchedulerUpdate.class); when(mockEvent2f.getAttempt()).thenReturn(mockAttempt2f); DAGEventSchedulerUpdate mockEvent3 = mock(DAGEventSchedulerUpdate.class); when(mockEvent3.getAttempt()).thenReturn(mockAttempt3); DAGScheduler scheduler = new DAGSchedulerMRR(mockDag, mockEventHandler, mockTaskScheduler, 0.5f); // M starts. M completes. R1 starts. R1 completes. R2 starts. R2 completes scheduler.scheduleTask(mockEvent1); // M starts Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 3); scheduler.scheduleTask(mockEvent1); // M runs another Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 3); scheduler.vertexCompleted(mockVertex1); // M completes scheduler.scheduleTask(mockEvent2); // R1 starts Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 6); scheduler.scheduleTask(mockEvent2); // R1 runs another Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 6); scheduler.scheduleTask(mockEvent2f); // R1 runs retry. Retry priority Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 4); scheduler.vertexCompleted(mockVertex2); // R1 completes scheduler.scheduleTask(mockEvent3); // R2 starts Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 9); scheduler.scheduleTask(mockEvent3); // R2 runs another Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 9); scheduler.vertexCompleted(mockVertex3); // R2 completes // M starts. R1 starts. M completes. R2 starts. R1 completes. R2 completes scheduler.scheduleTask(mockEvent1); // M starts Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 3); scheduler.scheduleTask(mockEvent2); // R1 starts. Reordered priority Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 2); scheduler.scheduleTask(mockEvent1); // M runs another Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 3); scheduler.scheduleTask(mockEvent2); // R1 runs another. Reordered priority Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 2); scheduler.scheduleTask(mockEvent2f); // R1 runs retry. Reordered priority Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 2); scheduler.vertexCompleted(mockVertex1); // M completes scheduler.scheduleTask(mockEvent3); // R2 starts. Reordered priority Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 5); scheduler.scheduleTask(mockEvent2); // R1 runs another. Normal priority Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 6); scheduler.scheduleTask(mockEvent2f); // R1 runs retry. Retry priority Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 4); scheduler.scheduleTask(mockEvent3); // R2 runs another. Reordered priority Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 5); scheduler.vertexCompleted(mockVertex2); // R1 completes scheduler.vertexCompleted(mockVertex3); // R2 completes // M starts. M completes. R1 starts. R2 starts. R1 completes. R2 completes scheduler.scheduleTask(mockEvent1); // M starts Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 3); scheduler.vertexCompleted(mockVertex1); // M completes scheduler.scheduleTask(mockEvent2); // R1 starts Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 6); scheduler.scheduleTask(mockEvent3); // R2 starts. Reordered priority Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 5); scheduler.scheduleTask(mockEvent2); // R1 runs another Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 6); scheduler.vertexCompleted(mockVertex2); // R1 completes scheduler.vertexCompleted(mockVertex3); // R2 completes // M starts. R1 starts. M completes. R1 completes. R2 starts. R2 completes scheduler.scheduleTask(mockEvent1); // M starts Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 3); scheduler.scheduleTask(mockEvent2); // R1 starts. Reordered priority Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 2); scheduler.vertexCompleted(mockVertex1); // M completes scheduler.scheduleTask(mockEvent2); // R1 starts. Normal priority Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 6); scheduler.vertexCompleted(mockVertex2); // R1 completes scheduler.scheduleTask(mockEvent3); // R2 starts Assert.assertTrue(mockEventHandler.event.getPriority().getPriority() == 9); scheduler.vertexCompleted(mockVertex3); // R2 completes }
public void setDestinationVertex(Vertex destinationVertex) { if (this.destinationVertex != null && this.destinationVertex != destinationVertex) { throw new TezUncheckedException("Destination vertex exists: " + destinationVertex.getName()); } this.destinationVertex = destinationVertex; }
public void setSourceVertex(Vertex sourceVertex) { if (this.sourceVertex != null && this.sourceVertex != sourceVertex) { throw new TezUncheckedException("Source vertex exists: " + sourceVertex.getName()); } this.sourceVertex = sourceVertex; }
public OutputSpec getSourceSpec(int sourceTaskIndex) { return new OutputSpec( destinationVertex.getName(), edgeProperty.getEdgeSource(), edgeManager.getNumSourceTaskOutputs(destinationVertex.getTotalTasks(), sourceTaskIndex)); }