The MapReduce application framework has rudimentary support for deploying a new version of the MapReduce framework via the distributed cache. By setting the appropriate configuration properties, users can run a different version of MapReduce than the one initially deployed to the cluster. For example, cluster administrators can place multiple versions of MapReduce in HDFS and configure mapred-site.xml to specify which version jobs will use by default. This allows the administrators to perform a rolling upgrade of the MapReduce framework under certain conditions.
The support for deploying the MapReduce framework via the distributed cache currently does not address the job client code used to submit and query jobs. It also does not address the ShuffleHandler code that runs as an auxilliary service within each NodeManager. As a result the following limitations apply to MapReduce versions that can be successfully deployed via the distributed cache in a rolling upgrade fashion:
Deploying a new MapReduce version consists of three steps:
Note that the location of the MapReduce archive can be critical to job submission and job startup performance. If the archive is not located on the cluster's default filesystem then it will be copied to the job staging directory for each job and localized to each node where the job's tasks run. This will slow down job submission and task startup performance.
If the archive is located on the default filesystem then the job client will not upload the archive to the job staging directory for each job submission. However if the archive path is not readable by all cluster users then the archive will be localized separately for each user on each node where tasks execute. This can cause unnecessary duplication in the distributed cache.
When working with a large cluster it can be important to increase the replication factor of the archive to increase its availability. This will spread the load when the nodes in the cluster localize the archive for the first time.
Setting a proper classpath for the MapReduce archive depends upon the composition of the archive and whether it has any additional dependencies. For example, the archive can contain not only the MapReduce jars but also the necessary YARN, HDFS, and Hadoop Common jars and all other dependencies. In that case, mapreduce.application.classpath would be configured to something like the following example, where the archive basename is hadoop-mapreduce-2.6.1.tar.gz and the archive is organized internally similar to the standard Hadoop distribution archive:
$HADOOP_CONF_DIR,$PWD/hadoop-mapreduce-2.6.1.tar.gz/hadoop-mapreduce-2.6.1/share/hadoop/mapreduce/*,$PWD/hadoop-mapreduce-2.6.1.tar.gz/hadoop-mapreduce-2.6.1/share/hadoop/mapreduce/lib/*,$PWD/hadoop-mapreduce-2.6.1.tar.gz/hadoop-mapreduce-2.6.1/share/hadoop/common/*,$PWD/hadoop-mapreduce-2.6.1.tar.gz/hadoop-mapreduce-2.6.1/share/hadoop/common/lib/*,$PWD/hadoop-mapreduce-2.6.1.tar.gz/hadoop-mapreduce-2.6.1/share/hadoop/yarn/*,$PWD/hadoop-mapreduce-2.6.1.tar.gz/hadoop-mapreduce-2.6.1/share/hadoop/yarn/lib/*,$PWD/hadoop-mapreduce-2.6.1.tar.gz/hadoop-mapreduce-2.6.1/share/hadoop/hdfs/*,$PWD/hadoop-mapreduce-2.6.1.tar.gz/hadoop-mapreduce-2.6.1/share/hadoop/hdfs/lib/*
Another possible approach is to have the archive consist of just the MapReduce jars and have the remaining dependencies picked up from the Hadoop distribution installed on the nodes. In that case, the above example would change to something like the following:
$HADOOP_CONF_DIR,$PWD/hadoop-mapreduce-2.6.1.tar.gz/hadoop-mapreduce-2.6.1/share/hadoop/mapreduce/*,$PWD/hadoop-mapreduce-2.6.1.tar.gz/hadoop-mapreduce-2.6.1/share/hadoop/mapreduce/lib/*,$HADOOP_COMMON_HOME/share/hadoop/common/*,$HADOOP_COMMON_HOME/share/hadoop/common/lib/*,$HADOOP_HDFS_HOME/share/hadoop/hdfs/*,$HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*,$HADOOP_YARN_HOME/share/hadoop/yarn/*,$HADOOP_YARN_HOME/share/hadoop/yarn/lib/*