Daniel Fritsi created YARN-10601:
------------------------------------

             Summary: The Yarn client should use the UGI who created the Yarn 
client for obtaining a delegation token for the remote log dir
                 Key: YARN-10601
                 URL: https://issues.apache.org/jira/browse/YARN-10601
             Project: Hadoop YARN
          Issue Type: Bug
          Components: log-aggregation
    Affects Versions: 3.3.0
            Reporter: Daniel Fritsi


It seems there was a bug introduced in YARN-10333 in this section of 
*{color:#0747A6}{{addLogAggregationDelegationToken}}{color}*:

{code:java}
Path remoteRootLogDir = fileController.getRemoteRootLogDir();
FileSystem fs = remoteRootLogDir.getFileSystem(conf);

final org.apache.hadoop.security.token.Token<?>[] finalTokens =
    fs.addDelegationTokens(masterPrincipal, credentials);
{code}

*{color:#0747A6}{{remoteRootLogDir.getFileSystem}}{color}* simply does this:

{code:java}
public FileSystem getFileSystem(Configuration conf) throws IOException {
  return FileSystem.get(this.toUri(), conf);
}
{code}

As far as I know it's customary to create a YarnClient instance via 
*{color:#0747A6}{{YarnClient.createYarnClient()}}{color}* in a 
UserGroupInformation.doAs block if you would like to use it with a different 
user then the current one. E.g.:

{code:java}
YarnClient yarnClient = ugi.doAs(new PrivilegedExceptionAction<YarnClient>() {
    @Override
    public YarnClient run() throws Exception {
        YarnClient yarnClient = YarnClient.createYarnClient();
        yarnClient.init(conf);
        yarnClient.start();
        return yarnClient;
    }
});
{code}

If this statement is correct then I think YarnClient should save the 
*{color:#0747A6}{{UserGroupInformation.getCurrentUser()}}{color}* when the 
YarnClient is being created and the 
*{color:#0747A6}{{remoteRootLogDir.getFileSystem(conf)}}{color}* call should be 
made inside an ugi.doAs block with that saved user.

A more concrete example:

{code:java}
public YarnClient createYarnClient(UserGroupInformation ugi, Configuration 
conf) throws Exception {
    return ugi.doAs((PrivilegedExceptionAction<YarnClient>) () -> {
        // Her I am the submitterUser (see below)
        YarnClient yarnClient = YarnClient.createYarnClient();
        yarnClient.init(conf);
        yarnClient.start();
        return yarnClient;
    });
}

public void run() {
    // Here I am the serviceUser
    // ...
    Configuration conf = ...
    // ...
    UserGroupInformation ugi = getSubmitterUser();
    // ...
    YarnClient yarnClient = createYarnClient(ugi);
    // ...
    ApplicationSubmissionContext context = ...
    // ...
    yarnClient.submitApplication(context);
}
{code}

As you can see *{color:#0747A6}{{submitApplication}}{color}* is not invoked 
inside an ugi.doAs block and submitApplication is the one who will eventually 
invoke *{color:#0747A6}{{addLogAggregationDelegationToken}}{color}*. That's why 
we need to save the UGI during the YarnClient creation and create the 
FileSystem instance inside an ugi.doAs with that saved user. Otherwise Yarn 
will try to get a delegation token with an incorrect user (serviceUser) instead 
of the submitterUser.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to