You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by pr...@apache.org on 2020/07/08 07:14:15 UTC
[hadoop] branch trunk updated: YARN-8047. RMWebApp make external
class pluggable.
This is an automated email from the ASF dual-hosted git repository.
prabhujoseph pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/hadoop.git
The following commit(s) were added to refs/heads/trunk by this push:
new 3a4d05b YARN-8047. RMWebApp make external class pluggable.
3a4d05b is described below
commit 3a4d05b850449c51a13f3a15fe0d756fdf50b4b2
Author: Prabhu Joseph <pr...@apache.org>
AuthorDate: Tue Jul 7 18:02:29 2020 +0530
YARN-8047. RMWebApp make external class pluggable.
Contributed by Bilwa S T.
---
.../apache/hadoop/yarn/conf/YarnConfiguration.java | 6 +++
.../src/main/resources/yarn-default.xml | 20 ++++++++
.../server/resourcemanager/webapp/RMWebApp.java | 11 +++++
.../resourcemanager/webapp/RmController.java | 53 ++++++++++++++++++++--
4 files changed, 87 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 54e8888..156943c 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
@@ -2390,6 +2390,12 @@ public class YarnConfiguration extends Configuration {
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.class";
+
/**
* 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 2f97a7c..1507296 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
@@ -3331,6 +3331,26 @@
</property>
<property>
+ <description>
+ Used to specify custom web services for Resourcemanager. Value can be
+ classnames separated by comma.
+ Ex: org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWebServices,
+ org.apache.hadoop.yarn.server.resourcemanager.webapp.DummyClass
+ </description>
+ <name>yarn.http.rmwebapp.external.classes</name>
+ <value></value>
+ </property>
+
+ <property>
+ <description>
+ Used to specify custom scheduler page
+ </description>
+ <name>hadoop.http.rmwebapp.scheduler.page.class</name>
+ <value></value>
+ </property>
+
+
+ <property>
<description>The Node Label script to run. Script output Line starting with
"NODE_PARTITION:" will be considered as Node Label Partition. In case of
multiple lines have this pattern, then last one will be considered
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 316e7ed..5075d25 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 class RMWebApp extends WebApp implements YarnWebParams {
bind(RMWebServices.class);
bind(GenericExceptionHandler.class);
bind(RMWebApp.class).toInstance(this);
+ bindExternalClasses();
if (rm != null) {
bind(ResourceManager.class).toInstance(rm);
@@ -97,6 +98,16 @@ public class RMWebApp extends WebApp implements YarnWebParams {
return super.getRedirectPath();
}
+ private void bindExternalClasses() {
+ YarnConfiguration yarnConf = new YarnConfiguration(rm.getConfig());
+ Class<?>[] externalClasses = yarnConf
+ .getClasses(YarnConfiguration.YARN_HTTP_WEBAPP_EXTERNAL_CLASSES);
+ 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 a291e05..e511d11 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 @@ package org.apache.hadoop.yarn.server.resourcemanager.webapp;
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,52 @@ public class RmController extends Controller {
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();
+
+ Class<? extends View> cls = PluginSchedulerPageHelper
+ .getPageClass(rm.getConfig());
+ if (cls != null) {
+ setTitle(schedulerName);
+ render(cls);
+ } else {
+ LOG.warn(
+ "Render default scheduler page as scheduler page configured doesn't exist");
+ setTitle("Default Scheduler");
+ render(DefaultSchedulerPage.class);
+ }
+ }
+
+ 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<?> configuredClass = conf
+ .getClass(YarnConfiguration.YARN_HTTP_WEBAPP_SCHEDULER_PAGE, null);
+ if (!View.class.isAssignableFrom(configuredClass)) {
+ return;
+ }
+ pageClass = (Class<? extends View>) configuredClass;
+ }
}
public void queue() {
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org