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 extends View> 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 extends View> pageClass = null;
+ public static Class extends View> 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 extends View>) configedClass;
+ }
}
public void queue() {