You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mapreduce-commits@hadoop.apache.org by vi...@apache.org on 2011/05/16 11:24:05 UTC

svn commit: r1103657 - in /hadoop/mapreduce/branches/MR-279: CHANGES.txt mr-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/job/impl/TaskAttemptImpl.java

Author: vinodkv
Date: Mon May 16 09:24:04 2011
New Revision: 1103657

URL: http://svn.apache.org/viewvc?rev=1103657&view=rev
Log:
Launching bin/yarn and bin/mapred only *once* in AM for constructing classpaths to avoid multiple forks and huge vmem usage by AM. Contributed by Vinod Kumar Vavilapalli.

Modified:
    hadoop/mapreduce/branches/MR-279/CHANGES.txt
    hadoop/mapreduce/branches/MR-279/mr-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/job/impl/TaskAttemptImpl.java

Modified: hadoop/mapreduce/branches/MR-279/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/CHANGES.txt?rev=1103657&r1=1103656&r2=1103657&view=diff
==============================================================================
--- hadoop/mapreduce/branches/MR-279/CHANGES.txt (original)
+++ hadoop/mapreduce/branches/MR-279/CHANGES.txt Mon May 16 09:24:04 2011
@@ -4,6 +4,9 @@ Trunk (unreleased changes)
 
   MAPREDUCE-279
 
+    Launching bin/yarn and bin/mapred only *once* in AM for constructing
+    classpaths to avoid multiple forks and huge vmem usage by AM. (vinodkv)
+
     Fix calculation of maximum capacity in ParentQueue to use its parent's 
     absolute-capacity rather than its own absolute-capacity. (acmurthy)
 

Modified: hadoop/mapreduce/branches/MR-279/mr-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/job/impl/TaskAttemptImpl.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/branches/MR-279/mr-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/job/impl/TaskAttemptImpl.java?rev=1103657&r1=1103656&r2=1103657&view=diff
==============================================================================
--- hadoop/mapreduce/branches/MR-279/mr-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/job/impl/TaskAttemptImpl.java (original)
+++ hadoop/mapreduce/branches/MR-279/mr-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/job/impl/TaskAttemptImpl.java Mon May 16 09:24:04 2011
@@ -29,6 +29,7 @@ import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -143,6 +144,8 @@ public abstract class TaskAttemptImpl im
   private final Lock writeLock;
   private Collection<Token<? extends TokenIdentifier>> fsTokens;
   private Token<JobTokenIdentifier> jobToken;
+  private AtomicBoolean initialEnvFlag = new AtomicBoolean();
+  private Map<String, String> initialEnv = null;
 
   private long launchTime;
   private long finishTime;
@@ -451,6 +454,23 @@ public abstract class TaskAttemptImpl im
   }
 
   /**
+   * Lock this on initialEnv so that there is only one fork in the AM for
+   * getting the initial class-path. TODO: This should go away once we construct
+   * a parent CLC and use it for all the containers.
+   */
+  private Map<String, String> getInitialEnv() throws IOException {
+    synchronized (initialEnvFlag) {
+      if (initialEnvFlag.get()) {
+        return initialEnv;
+      }
+      initialEnv = new HashMap<String, String>();
+      MRApps.setInitialClasspath(initialEnv);
+      initialEnvFlag.set(true);
+      return initialEnv;
+    }
+  }
+
+  /**
    * Create the {@link ContainerLaunchContext} for this attempt.
    */
   private ContainerLaunchContext createContainerLaunchContext() {
@@ -524,9 +544,7 @@ public abstract class TaskAttemptImpl im
               ByteBuffer.wrap(jobToken_dob.getData(), 0,
                   jobToken_dob.getLength()));
 
-      Map<String, String> env = new HashMap<String, String>();
-      MRApps.setInitialClasspath(env);
-      container.addAllEnv(env);
+      container.addAllEnv(getInitialEnv());
     } catch (IOException e) {
       throw new YarnException(e);
     }