public UserGroupInformation getUmbilicalUgi(String appTokenIdentifier,
        Token<JobTokenIdentifier> appToken) throws ExecutionException {
      BlockingQueue<UserGroupInformation> queue = ugiPool.get(appTokenIdentifier,
          new Callable<BlockingQueue<UserGroupInformation>>() {
            @Override
            public BlockingQueue<UserGroupInformation> call() throws Exception {
              UserGroupInformation ugi = UserGroupInformation.createRemoteUser(appTokenIdentifier);
              ugi.addToken(appToken);
              BlockingQueue<UserGroupInformation> queue = new LinkedBlockingQueue<>(numExecutors);
              queue.add(ugi);
              LOG.debug("Added new ugi pool for {}. Pool Size: {}", appTokenIdentifier, ugiPool.size());
              return queue;
            }
          });

      //Get UGI from the queue. Possible to maintain more than one UGI per AM. Ref: HIVE-16634
      UserGroupInformation ugi = queue.poll();
      if (ugi == null) {
        ugi = UserGroupInformation.createRemoteUser(appTokenIdentifier);
        ugi.addToken(appToken);
        queue.offer(ugi);
        LOG.info("Added new ugi pool for {}. Pool Size: {}", appTokenIdentifier, ugiPool.size());
      }
      return ugi;
    }
Get UGI for a given AM and appToken. It is possible to have more than one
UGI per AM.

@param appTokenIdentifier
@param appToken
@return UserGroupInformation
@throws ExecutionException
llap-server/src/java/org/apache/hadoop/hive/llap/daemon/impl/ContainerRunnerImpl.java