Ran into an interesting situation relating to framework app in hdfs using
mapreduce.application.framework.path.

Had mapreduce.application.framework.path configured with the
mapreduce.tar.gz#mr-framework and mapreduce.application.classpath referring
to the mr-framework directories.

Later when attempted to withdraw this in the job client (where
mapreduce.application.framework.path was set to empty and
mapreduce.application.classpath set to jars in hadoop installation on the
hosts)  the MRAppMaster was throwing this

java.lang.IllegalArgumentException: Could not locate MapReduce framework
name 'mr-framework' in mapreduce.application.classpath
    at
org.apache.hadoop.mapreduce.v2.util.MRApps.setMRFrameworkClasspath(MRApps.java:228)
    at
org.apache.hadoop.mapreduce.v2.util.MRApps.setClasspath(MRApps.java:248)
    at
org.apache.hadoop.mapreduce.v2.app.job.impl.TaskAttemptImpl.getInitialClasspath(TaskAttemptImpl.java:620)
    at
org.apache.hadoop.mapreduce.v2.app.job.impl.TaskAttemptImpl.createCommonContainerLaunchContext(TaskAttemptImpl.java:755)
    at
org.apache.hadoop.mapreduce.v2.app.job.impl.TaskAttemptImpl.createContainerLaunchContext(TaskAttemptImpl.java:812)
    at
org.apache.hadoop.mapreduce.v2.app.job.impl.TaskAttemptImpl$ContainerAssignedTransition.transition(TaskAttemptImpl.java:1527)
    at
org.apache.hadoop.mapreduce.v2.app.job.impl.TaskAttemptImpl$ContainerAssignedTransition.transition(TaskAttemptImpl.java:1504)
    at
org.apache.hadoop.yarn.state.StateMachineFactory$SingleInternalArc.doTransition(StateMachineFactory.java:362)
    at
org.apache.hadoop.yarn.state.StateMachineFactory.doTransition(StateMachineFactory.java:302)
    at
org.apache.hadoop.yarn.state.StateMachineFactory.access$300(StateMachineFactory.java:46)
    at
org.apache.hadoop.yarn.state.StateMachineFactory$InternalStateMachine.doTransition(StateMachineFactory.java:448)
    at
org.apache.hadoop.mapreduce.v2.app.job.impl.TaskAttemptImpl.handle(TaskAttemptImpl.java:1069)
    at
org.apache.hadoop.mapreduce.v2.app.job.impl.TaskAttemptImpl.handle(TaskAttemptImpl.java:145)
    at
org.apache.hadoop.mapreduce.v2.app.MRAppMaster$TaskAttemptEventDispatcher.handle(MRAppMaster.java:1311)
    at
org.apache.hadoop.mapreduce.v2.app.MRAppMaster$TaskAttemptEventDispatcher.handle(MRAppMaster.java:1303)
    at
org.apache.hadoop.yarn.event.AsyncDispatcher.dispatch(AsyncDispatcher.java:173)
    at
org.apache.hadoop.yarn.event.AsyncDispatcher$1.run(AsyncDispatcher.java:106)
    at java.lang.Thread.run(Thread.java:745)

Turns out that mapreduce.application.classpath was being sourced via
job.xml while the mapreduce.application.framework.path was being sourced
from node local mapred-site.xml (given the mapreduce.framework.path wasn't
present in the job.xml). This meant that it wasn't possible to withdraw
localizing framework app from hdfs without fixing the config in all the
nodes.

Question to this group is, Aren't these configs app specific ones ? Why is
it necessary to load the default config in MRAppMaster instead of just
working with job.xml? Specific section of code of interest:

      MRAppMaster appMaster =
          new MRAppMaster(applicationAttemptId, containerId, nodeHostString,
              Integer.parseInt(nodePortString),
              Integer.parseInt(nodeHttpPortString), appSubmitTime);
      ShutdownHookManager.get().addShutdownHook(
        new MRAppMasterShutdownHook(appMaster), SHUTDOWN_HOOK_PRIORITY);
      JobConf conf = new JobConf(new YarnConfiguration());
      conf.addResource(new Path(MRJobConfig.JOB_CONF_FILE));

Another observation is that the job.xml visible via the UI keeps showing
the job.xml as provided by the user, however the conf.xml in job-staging
directory under user's home had the merged config from
node::mapred-site.xml + job.xml

FWIW, adding a :/mr-framework/* to mapreduce.application.classpath allows
you to wriggle out of this situation.

Regards
Srikanth Sundarrajan

Reply via email to