public void taskKilled(String amLocation, int port, String umbilicalUser, Token<JobTokenIdentifier> jobToken,
                         final QueryIdentifier queryIdentifier, final TezTaskAttemptID taskAttemptId) {
    LlapNodeId amNodeId = LlapNodeId.getInstance(amLocation, port);
    AMNodeInfo amNodeInfo;
    synchronized (knownAppMasters) {
      amNodeInfo = getAMNodeInfo(amLocation, port, queryIdentifier);
      if (amNodeInfo == null) {
        amNodeInfo = new AMNodeInfo(amNodeId, umbilicalUser, jobToken, queryIdentifier, retryPolicy, retryTimeout, socketFactory,
          conf);
      }
    }

    // Even if the service hasn't started up. It's OK to make this invocation since this will
    // only happen after the AtomicReference address has been populated. Not adding an additional check.
    ListenableFuture<Void> future =
        executor.submit(new KillTaskCallable(taskAttemptId, amNodeInfo));
    Futures.addCallback(future, new FutureCallback<Void>() {
      @Override
      public void onSuccess(Void result) {
        LOG.info("Sent taskKilled for {}", taskAttemptId);
      }

      @Override
      public void onFailure(Throwable t) {
        LOG.warn("Failed to send taskKilled for {}. The attempt will likely time out.",
            taskAttemptId);
      }
    }, MoreExecutors.directExecutor());
  }
Responsible for communicating with various AMs.
llap-server/src/java/org/apache/hadoop/hive/llap/daemon/impl/AMReporter.java