synchronized void shutdownTezAM() {
   sessionStopped.set(true);
   if (currentDAG != null && !currentDAG.isComplete()) {
     // send a DAG_KILL message
     LOG.info("Sending a kill event to the current DAG" + ", dagId=" + currentDAG.getID());
     sendEvent(new DAGEvent(currentDAG.getID(), DAGEventType.DAG_KILL));
   } else {
     LOG.info("No current running DAG, shutting down the AM");
     if (isSession && !state.equals(DAGAppMasterState.ERROR)) {
       state = DAGAppMasterState.SUCCEEDED;
     }
     shutdownHandler.shutdown();
   }
 }
  synchronized String submitDAGToAppMaster(DAGPlan dagPlan) throws TezException {
    if (currentDAG != null && !state.equals(DAGAppMasterState.IDLE)) {
      throw new TezException("App master already running a DAG");
    }
    if (state.equals(DAGAppMasterState.ERROR) || sessionStopped.get()) {
      throw new TezException(
          "AM unable to accept new DAG submissions." + " In the process of shutting down");
    }

    // RPC server runs in the context of the job user as it was started in
    // the job user's UGI context
    LOG.info("Starting DAG submitted via RPC");

    if (LOG.isDebugEnabled()) {
      LOG.debug("Writing DAG plan to: " + TezConfiguration.TEZ_PB_PLAN_TEXT_NAME);

      File outFile = new File(TezConfiguration.TEZ_PB_PLAN_TEXT_NAME);
      try {
        PrintWriter printWriter = new PrintWriter(outFile);
        String dagPbString = dagPlan.toString();
        printWriter.println(dagPbString);
        printWriter.close();
      } catch (IOException e) {
        throw new TezException("Failed to write TEZ_PLAN to " + outFile.toString(), e);
      }
    }

    submittedDAGs.incrementAndGet();
    startDAG(dagPlan);
    return currentDAG.getID().toString();
  }
  private void startDAG(DAG dag) {
    currentDAG = dag;
    this.state = DAGAppMasterState.RUNNING;

    // End of creating the job.
    ((RunningAppContext) context).setDAG(currentDAG);

    // create a job event for job initialization
    DAGEvent initDagEvent = new DAGEvent(currentDAG.getID(), DAGEventType.DAG_INIT);
    // Send init to the job (this does NOT trigger job execution)
    // This is a synchronous call, not an event through dispatcher. We want
    // job-init to be done completely here.
    dagEventDispatcher.handle(initDagEvent);

    // All components have started, start the job.
    /** create a job-start event to get this ball rolling */
    DAGEvent startDagEvent = new DAGEvent(currentDAG.getID(), DAGEventType.DAG_START);
    /** send the job-start event. this triggers the job execution. */
    sendEvent(startDagEvent);
  }
 @Override
 public TezDAGID getCurrentDAGID() {
   try {
     rLock.lock();
     if (dag != null) {
       return dag.getID();
     }
     return null;
   } finally {
     rLock.unlock();
   }
 }
예제 #5
0
  @Test(timeout = 5000)
  public void testDAGClientHandler() throws TezException {

    TezDAGID mockTezDAGId = mock(TezDAGID.class);
    when(mockTezDAGId.getId()).thenReturn(1);
    when(mockTezDAGId.toString()).thenReturn("dag_9999_0001_1");

    DAG mockDAG = mock(DAG.class);
    when(mockDAG.getID()).thenReturn(mockTezDAGId);
    DAGStatusBuilder mockDagStatusBuilder = mock(DAGStatusBuilder.class);
    when(mockDAG.getDAGStatus(anySetOf(StatusGetOpts.class))).thenReturn(mockDagStatusBuilder);
    VertexStatusBuilder mockVertexStatusBuilder = mock(VertexStatusBuilder.class);
    when(mockDAG.getVertexStatus(anyString(), anySetOf(StatusGetOpts.class)))
        .thenReturn(mockVertexStatusBuilder);

    DAGAppMaster mockDagAM = mock(DAGAppMaster.class);
    when(mockDagAM.getState()).thenReturn(DAGAppMasterState.RUNNING);
    AppContext mockAppContext = mock(AppContext.class);
    when(mockDagAM.getContext()).thenReturn(mockAppContext);
    when(mockDagAM.getContext().getCurrentDAG()).thenReturn(mockDAG);

    DAGClientHandler dagClientHandler = new DAGClientHandler(mockDagAM);

    // getAllDAGs()
    assertEquals(1, dagClientHandler.getAllDAGs().size());
    assertEquals("dag_9999_0001_1", dagClientHandler.getAllDAGs().get(0));

    // getDAGStatus
    try {
      dagClientHandler.getDAGStatus("dag_9999_0001_2", Sets.newSet(StatusGetOpts.GET_COUNTERS));
      fail("should not come here");
    } catch (TezException e) {
      assertTrue(e.getMessage().contains("Unknown dagId"));
    }
    DAGStatus dagStatus =
        dagClientHandler.getDAGStatus("dag_9999_0001_1", Sets.newSet(StatusGetOpts.GET_COUNTERS));
    assertEquals(mockDagStatusBuilder, dagStatus);

    // getVertexStatus
    try {
      dagClientHandler.getVertexStatus(
          "dag_9999_0001_2", "v1", Sets.newSet(StatusGetOpts.GET_COUNTERS));
      fail("should not come here");
    } catch (TezException e) {
      assertTrue(e.getMessage().contains("Unknown dagId"));
    }
    VertexStatus vertexStatus =
        dagClientHandler.getVertexStatus(
            "dag_9999_0001_1", "v1", Sets.newSet(StatusGetOpts.GET_COUNTERS));
    assertEquals(mockVertexStatusBuilder, vertexStatus);

    // getTezAppMasterStatus
    when(mockDagAM.isSession()).thenReturn(false);

    assertEquals(TezAppMasterStatus.RUNNING, dagClientHandler.getTezAppMasterStatus());

    when(mockDagAM.isSession()).thenReturn(true);
    when(mockDagAM.getState()).thenReturn(DAGAppMasterState.INITED);
    assertEquals(TezAppMasterStatus.INITIALIZING, dagClientHandler.getTezAppMasterStatus());
    when(mockDagAM.getState()).thenReturn(DAGAppMasterState.ERROR);
    assertEquals(TezAppMasterStatus.SHUTDOWN, dagClientHandler.getTezAppMasterStatus());

    // tryKillDAG
    try {
      dagClientHandler.tryKillDAG("dag_9999_0001_2");
      fail("should not come here");
    } catch (TezException e) {
      assertTrue(e.getMessage().contains("Unknown dagId"));
    }
    dagClientHandler.tryKillDAG("dag_9999_0001_1");
    ArgumentCaptor<DAG> eventCaptor = ArgumentCaptor.forClass(DAG.class);
    verify(mockDagAM, times(1))
        .tryKillDAG(eventCaptor.capture(), contains("Sending client kill from"));
    assertEquals(1, eventCaptor.getAllValues().size());
    assertTrue(eventCaptor.getAllValues().get(0) instanceof DAG);
    assertEquals("dag_9999_0001_1", ((DAG) eventCaptor.getAllValues().get(0)).getID().toString());

    // submitDAG
    DAGPlan dagPlan = DAGPlan.getDefaultInstance();
    Map<String, LocalResource> localResources = new HashMap<String, LocalResource>();
    dagClientHandler.submitDAG(dagPlan, localResources);
    verify(mockDagAM).submitDAGToAppMaster(dagPlan, localResources);

    // shutdown
    dagClientHandler.shutdownAM();
    verify(mockDagAM).shutdownTezAM(contains("Received message to shutdown AM from"));
  }
 public void tryKillDAG(String dagIdStr) throws TezException {
   DAG dag = getDAG(dagIdStr);
   LOG.info("Sending client kill to dag: " + dagIdStr);
   // send a DAG_KILL message
   sendEvent(new DAGEvent(dag.getID(), DAGEventType.DAG_KILL));
 }
 private synchronized void handle(DAGAppMasterEvent event) {
   switch (event.getType()) {
     case INTERNAL_ERROR:
       state = DAGAppMasterState.ERROR;
       if (currentDAG != null) {
         // notify dag to finish which will send the DAG_FINISHED event
         LOG.info("Internal Error. Notifying dags to finish.");
         sendEvent(new DAGEvent(currentDAG.getID(), DAGEventType.INTERNAL_ERROR));
       } else {
         LOG.info("Internal Error. Finishing directly as no dag is active.");
         shutdownHandler.shutdown();
       }
       break;
     case DAG_FINISHED:
       DAGAppMasterEventDAGFinished finishEvt = (DAGAppMasterEventDAGFinished) event;
       if (!isSession) {
         setStateOnDAGCompletion();
         LOG.info("Shutting down on completion of dag:" + finishEvt.getDAGId().toString());
         shutdownHandler.shutdown();
       } else {
         LOG.info(
             "DAG completed, dagId="
                 + finishEvt.getDAGId().toString()
                 + ", dagState="
                 + finishEvt.getDAGState());
         lastDAGCompletionTime = clock.getTime();
         switch (finishEvt.getDAGState()) {
           case SUCCEEDED:
             successfulDAGs.incrementAndGet();
             break;
           case ERROR:
           case FAILED:
             failedDAGs.incrementAndGet();
             break;
           case KILLED:
             killedDAGs.incrementAndGet();
             break;
           default:
             LOG.fatal(
                 "Received a DAG Finished Event with state="
                     + finishEvt.getDAGState()
                     + ". Error. Shutting down.");
             state = DAGAppMasterState.ERROR;
             shutdownHandler.shutdown();
             break;
         }
         if (!state.equals(DAGAppMasterState.ERROR)) {
           if (!sessionStopped.get()) {
             LOG.info("Waiting for next DAG to be submitted.");
             state = DAGAppMasterState.IDLE;
           } else {
             LOG.info("Session shutting down now.");
             state = DAGAppMasterState.SUCCEEDED;
             shutdownHandler.shutdown();
           }
         }
       }
       break;
     default:
       throw new TezUncheckedException("AppMaster: No handler for event type: " + event.getType());
   }
 }