Przeglądaj źródła

YARN-9984. FSPreemptionThread can cause NullPointerException while app is unregistered with containers running on a node. Contributed by Wilfred Spiegelenburg.

Sunil G 5 lat temu
rodzic
commit
215f2052fc

+ 14 - 3
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSPreemptionThread.java

@@ -125,9 +125,13 @@ class FSPreemptionThread extends Thread {
             for (RMContainer container : containers) {
               FSAppAttempt app = scheduler.getSchedulerApp(
                       container.getApplicationAttemptId());
-              LOG.info("Preempting container " + container +
-                      " from queue " + app.getQueueName());
-              app.trackContainerForPreemption(container);
+              LOG.info("Preempting container " + container + " from queue: "
+                  + (app != null ? app.getQueueName() : "unknown"));
+              // If the app has unregistered while building the container list
+              // the app might be null, skip notifying the app
+              if (app != null) {
+                app.trackContainerForPreemption(container);
+              }
             }
           }
         }
@@ -189,6 +193,13 @@ class FSPreemptionThread extends Thread {
     for (RMContainer container : containersToCheck) {
       FSAppAttempt app =
           scheduler.getSchedulerApp(container.getApplicationAttemptId());
+      // If the app has unregistered while building the container list the app
+      // might be null, just skip this container: it should be cleaned up soon
+      if (app == null) {
+        LOG.info("Found container " + container + " on node "
+            + node.getNodeName() + "without app, skipping preemption");
+        continue;
+      }
       ApplicationId appId = app.getApplicationId();
 
       if (app.canContainerBePreempted(container,