1095d9c19bfca4d0cc0dd2dd01bc8ca96e5fac3f .../apache/hadoop/yarn/conf/YarnConfiguration.java | 6 +++ .../src/main/resources/yarn-default.xml | 17 +++++++ .../server/resourcemanager/webapp/RMWebApp.java | 13 +++++ .../resourcemanager/webapp/RmController.java | 55 ++++++++++++++++++++-- 4 files changed, 88 insertions(+), 3 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java index a5fb7230602..2204048baeb 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java @@ -1938,6 +1938,12 @@ public static boolean isAclEnabled(Configuration conf) { public static final boolean DEFAULT_NM_DOCKER_ALLOW_HOST_PID_NAMESPACE = false; + public static final String YARN_HTTP_WEBAPP_EXTERNAL_CLASSES = + "yarn.http.rmwebapp.external.classes"; + + public static final String YARN_HTTP_WEBAPP_SCHEDULER_PAGE = + "hadoop.http.rmwebapp.scheduler.page.classes"; + /** * Whether or not users are allowed to request that Docker containers honor * the debug deletion delay. This is useful for troubleshooting Docker diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml index 412fd022e07..0e2a6a269db 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml @@ -2893,6 +2893,23 @@ yarn.resourcemanager.decommissioning-nodes-watcher.poll-interval-secs 20 + + + + External Classes + + yarn.http.rmwebapp.external.classes + + + + + + Page Class + + hadoop.http.rmwebapp.scheduler.page.classes + + + The Node Label script to run. Script output Line starting with diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebApp.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebApp.java index b8d43900803..0a2136f4738 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebApp.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebApp.java @@ -55,6 +55,7 @@ public void setup() { bind(RMWebServices.class); bind(GenericExceptionHandler.class); bind(RMWebApp.class).toInstance(this); + bindExternalClasses(); if (rm != null) { bind(ResourceManager.class).toInstance(rm); @@ -97,6 +98,18 @@ public String getRedirectPath() { return super.getRedirectPath(); } + private void bindExternalClasses() { + YarnConfiguration yarnConf = new YarnConfiguration(rm.getConfig()); + Class[] externalClasses = yarnConf.getClasses(YarnConfiguration.YARN_HTTP_WEBAPP_EXTERNAL_CLASSES); + if (externalClasses == null) { + return; + } + for (Class c : externalClasses) { + bind(c); + } + } + + private String buildRedirectPath() { // make a copy of the original configuration so not to mutate it. Also use // an YarnConfiguration to force loading of yarn-site.xml. diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RmController.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RmController.java index a291e0548db..c4b6d625292 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RmController.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RmController.java @@ -21,13 +21,17 @@ import static org.apache.hadoop.yarn.util.StringHelper.join; import static org.apache.hadoop.yarn.webapp.YarnWebParams.QUEUE_NAME; +import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.yarn.api.records.YarnApplicationState; +import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler; import org.apache.hadoop.yarn.util.StringHelper; import org.apache.hadoop.yarn.webapp.Controller; +import org.apache.hadoop.yarn.webapp.View; import org.apache.hadoop.yarn.webapp.YarnWebParams; import com.google.inject.Inject; @@ -92,9 +96,54 @@ public void scheduler() { render(FairSchedulerPage.class); return; } - - setTitle("Default Scheduler"); - render(DefaultSchedulerPage.class); + + if (rs instanceof FifoScheduler) { + setTitle("FIFO Scheduler"); + render(DefaultSchedulerPage.class); + return; + } + + renderOtherPluginScheduler(rm); + } + + private void renderOtherPluginScheduler(ResourceManager rm) { + ResourceScheduler rs = rm.getResourceScheduler(); + String schedulerName = rs.getClass().getSimpleName(); + System.out.println(schedulerName); + setTitle(schedulerName); + + Class cls = PluginSchedulerPageHelper.getPageClass(rm + .getConfig()); + if (cls != null) { + render(cls); + } else { + renderText("Not Found"); + } + } + + static class PluginSchedulerPageHelper { + private static boolean hasLoaded = false; + private static Class pageClass = null; + public static Class getPageClass(Configuration conf) { + if (!hasLoaded) { + loadPluginSchedulerPageClass(conf); + hasLoaded = true; + } + return pageClass; + } + private static void loadPluginSchedulerPageClass(Configuration conf) + { + Class configedClass = conf.getClass( + YarnConfiguration.YARN_HTTP_WEBAPP_SCHEDULER_PAGE, null); + if (configedClass == null) + { + return; + } + if (!View.class.isAssignableFrom(configedClass)) { + return; + } + pageClass = (Class) configedClass; + } } public void queue() {