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 06c3fa4c64a..ef76cd5076f 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 @@ -3835,6 +3835,16 @@ public static boolean isAclEnabled(Configuration conf) { public static final boolean DEFAULT_ROUTER_WEBAPP_PARTIAL_RESULTS_ENABLED = false; + /** + * Connection and Read timeout from the Router to RM. + */ + public static final String ROUTER_WEBAPP_CONNECT_TIMEOUT_MS = + ROUTER_WEBAPP_PREFIX + "connect-timeout-ms"; + public static final int DEFAULT_ROUTER_WEBAPP_CONNECT_TIMEOUT_MS = 60000; + public static final String ROUTER_WEBAPP_READ_TIMEOUT_MS = + ROUTER_WEBAPP_PREFIX + "read-timeout-ms"; + public static final int DEFAULT_ROUTER_WEBAPP_READ_TIMEOUT_MS = 60000; + //////////////////////////////// // CSI Volume configs //////////////////////////////// diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/test/java/org/apache/hadoop/yarn/conf/TestYarnConfigurationFields.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/test/java/org/apache/hadoop/yarn/conf/TestYarnConfigurationFields.java index 6f781fa7c0d..56cde0252cb 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/test/java/org/apache/hadoop/yarn/conf/TestYarnConfigurationFields.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/test/java/org/apache/hadoop/yarn/conf/TestYarnConfigurationFields.java @@ -183,6 +183,10 @@ public void initializeMemberVariables() { .add(YarnConfiguration.ROUTER_CLIENTRM_SUBMIT_RETRY); configurationPrefixToSkipCompare .add(YarnConfiguration.ROUTER_WEBAPP_PARTIAL_RESULTS_ENABLED); + configurationPrefixToSkipCompare + .add(YarnConfiguration.ROUTER_WEBAPP_CONNECT_TIMEOUT_MS); + configurationPrefixToSkipCompare + .add(YarnConfiguration.ROUTER_WEBAPP_READ_TIMEOUT_MS); // Set by container-executor.cfg configurationPrefixToSkipCompare.add(YarnConfiguration.NM_USER_HOME_DIR); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/AboutBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/AboutBlock.java index cd588fc4420..eaf0f5e8b93 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/AboutBlock.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/AboutBlock.java @@ -18,6 +18,7 @@ package org.apache.hadoop.yarn.server.router.webapp; +import com.sun.jersey.api.client.Client; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.util.StringUtils; import org.apache.hadoop.yarn.conf.YarnConfiguration; @@ -48,11 +49,14 @@ @Override protected void render(Block html) { Configuration conf = this.router.getConfig(); + + Client client = RouterWebServiceUtil.createJerseyClient(conf); + String webAppAddress = WebAppUtils.getRouterWebAppURLWithScheme(conf); ClusterMetricsInfo metrics = RouterWebServiceUtil.genericForward( webAppAddress, null, ClusterMetricsInfo.class, HTTPMethods.GET, - RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.METRICS, null, null); + RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.METRICS, null, null, client); boolean isEnabled = conf.getBoolean( YarnConfiguration.FEDERATION_ENABLED, YarnConfiguration.DEFAULT_FEDERATION_ENABLED); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/AppsBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/AppsBlock.java index 028bacd07c4..1278edea831 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/AppsBlock.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/AppsBlock.java @@ -24,6 +24,7 @@ import static org.apache.hadoop.yarn.webapp.view.JQueryUI.C_PROGRESSBAR; import static org.apache.hadoop.yarn.webapp.view.JQueryUI.C_PROGRESSBAR_VALUE; +import com.sun.jersey.api.client.Client; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWSConsts; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppInfo; @@ -53,10 +54,13 @@ protected void render(Block html) { // Get the applications from the Resource Managers Configuration conf = this.router.getConfig(); + + Client client = RouterWebServiceUtil.createJerseyClient(conf); + String webAppAddress = WebAppUtils.getRouterWebAppURLWithScheme(conf); AppsInfo apps = RouterWebServiceUtil.genericForward(webAppAddress, null, AppsInfo.class, HTTPMethods.GET, - RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS, null, null); + RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS, null, null, client); setTitle("Applications"); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/DefaultRequestInterceptorREST.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/DefaultRequestInterceptorREST.java index 3dc4fddb922..dd426edec06 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/DefaultRequestInterceptorREST.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/DefaultRequestInterceptorREST.java @@ -27,6 +27,7 @@ import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.Response; +import com.sun.jersey.api.client.Client; import org.apache.hadoop.security.authorize.AuthorizationException; import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; @@ -77,6 +78,10 @@ private String webAppAddress; private SubClusterId subClusterId = null; + // It is very expensive to create the client + // Jersey will spawn a thread for every client request + private Client client = null; + public void setWebAppAddress(String webAppAddress) { this.webAppAddress = webAppAddress; } @@ -92,6 +97,7 @@ protected SubClusterId getSubClusterId() { @Override public void init(String user) { webAppAddress = WebAppUtils.getRMWebAppURLWithScheme(getConf()); + client = RouterWebServiceUtil.createJerseyClient(getConf()); } @Override @@ -103,28 +109,28 @@ public ClusterInfo get() { public ClusterInfo getClusterInfo() { return RouterWebServiceUtil.genericForward(webAppAddress, null, ClusterInfo.class, HTTPMethods.GET, - RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.INFO, null, null); + RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.INFO, null, null, client); } @Override public ClusterUserInfo getClusterUserInfo(HttpServletRequest hsr) { return RouterWebServiceUtil.genericForward(webAppAddress, hsr, ClusterUserInfo.class, HTTPMethods.GET, - RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.CLUSTER_USER_INFO, null, null); + RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.CLUSTER_USER_INFO, null, null, client); } @Override public ClusterMetricsInfo getClusterMetricsInfo() { return RouterWebServiceUtil.genericForward(webAppAddress, null, ClusterMetricsInfo.class, HTTPMethods.GET, - RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.METRICS, null, null); + RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.METRICS, null, null, client); } @Override public SchedulerTypeInfo getSchedulerInfo() { return RouterWebServiceUtil.genericForward(webAppAddress, null, SchedulerTypeInfo.class, HTTPMethods.GET, - RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.SCHEDULER, null, null); + RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.SCHEDULER, null, null, client); } @Override @@ -133,7 +139,7 @@ public String dumpSchedulerLogs(String time, HttpServletRequest hsr) // time is specified inside hsr return RouterWebServiceUtil.genericForward(webAppAddress, null, String.class, HTTPMethods.GET, - RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.SCHEDULER_LOGS, null, null); + RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.SCHEDULER_LOGS, null, null, client); } @Override @@ -146,7 +152,7 @@ public NodesInfo getNodes(String states) { return RouterWebServiceUtil.genericForward(webAppAddress, null, NodesInfo.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.NODES, null, - additionalParam); + additionalParam, client); } @Override @@ -154,7 +160,7 @@ public NodeInfo getNode(String nodeId) { return RouterWebServiceUtil.genericForward(webAppAddress, null, NodeInfo.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.NODES + "/" + nodeId, null, - null); + null, client); } @Override @@ -164,7 +170,7 @@ public ResourceInfo updateNodeResource(HttpServletRequest hsr, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.NODES + "/" + nodeId; return RouterWebServiceUtil.genericForward(webAppAddress, hsr, ResourceInfo.class, HTTPMethods.POST, - nodePath + "/resource", resourceOption, null); + nodePath + "/resource", resourceOption, null, client); } @Override @@ -176,7 +182,7 @@ public AppsInfo getApps(HttpServletRequest hsr, String stateQuery, // all the params are specified inside hsr return RouterWebServiceUtil.genericForward(webAppAddress, hsr, AppsInfo.class, HTTPMethods.GET, - RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS, null, null); + RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS, null, null, client); } @Override @@ -186,7 +192,7 @@ public ActivitiesInfo getActivities(HttpServletRequest hsr, String nodeId, return RouterWebServiceUtil.genericForward(webAppAddress, hsr, ActivitiesInfo.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.SCHEDULER_ACTIVITIES, null, - null); + null, client); } @Override @@ -198,7 +204,7 @@ public AppActivitiesInfo getAppActivities(HttpServletRequest hsr, return RouterWebServiceUtil.genericForward(webAppAddress, hsr, AppActivitiesInfo.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.SCHEDULER_APP_ACTIVITIES, - null, null); + null, null, client); } @Override @@ -207,7 +213,7 @@ public ApplicationStatisticsInfo getAppStatistics(HttpServletRequest hsr, // stateQueries and typeQueries are specified inside hsr return RouterWebServiceUtil.genericForward(webAppAddress, hsr, ApplicationStatisticsInfo.class, HTTPMethods.GET, - RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APP_STATISTICS, null, null); + RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APP_STATISTICS, null, null, client); } @Override @@ -217,7 +223,7 @@ public AppInfo getApp(HttpServletRequest hsr, String appId, return RouterWebServiceUtil.genericForward(webAppAddress, hsr, AppInfo.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS + "/" + appId, null, - null); + null, client); } @Override @@ -226,7 +232,7 @@ public AppState getAppState(HttpServletRequest hsr, String appId) return RouterWebServiceUtil.genericForward(webAppAddress, hsr, AppState.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS + "/" + appId + "/" + RMWSConsts.STATE, - null, null); + null, null, client); } @Override @@ -236,7 +242,7 @@ public Response updateAppState(AppState targetState, HttpServletRequest hsr, return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.PUT, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS + "/" + appId + "/" + RMWSConsts.STATE, - targetState, null); + targetState, null, client); } @Override @@ -245,7 +251,7 @@ public NodeToLabelsInfo getNodeToLabels(HttpServletRequest hsr) return RouterWebServiceUtil.genericForward(webAppAddress, hsr, NodeToLabelsInfo.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.GET_NODE_TO_LABELS, null, - null); + null, client); } @Override @@ -260,7 +266,7 @@ public LabelsToNodesInfo getLabelsToNodes(Set labels) return RouterWebServiceUtil.genericForward(webAppAddress, null, LabelsToNodesInfo.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.LABEL_MAPPINGS, null, - additionalParam); + additionalParam, client); } @Override @@ -269,7 +275,7 @@ public Response replaceLabelsOnNodes(NodeToLabelsEntryList newNodeToLabels, return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.POST, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.REPLACE_NODE_TO_LABELS, - newNodeToLabels, null); + newNodeToLabels, null, client); } @Override @@ -280,7 +286,7 @@ public Response replaceLabelsOnNode(Set newNodeLabelsName, .genericForward(webAppAddress, hsr, Response.class, HTTPMethods.POST, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.NODES + "/" + nodeId + "/replace-labels", - null, null); + null, null, client); } @Override @@ -289,7 +295,7 @@ public NodeLabelsInfo getClusterNodeLabels(HttpServletRequest hsr) return RouterWebServiceUtil.genericForward(webAppAddress, hsr, NodeLabelsInfo.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.GET_NODE_LABELS, null, - null); + null, client); } @Override @@ -298,7 +304,7 @@ public Response addToClusterNodeLabels(NodeLabelsInfo newNodeLabels, return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.POST, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.ADD_NODE_LABELS, - newNodeLabels, null); + newNodeLabels, null, client); } @Override @@ -308,7 +314,7 @@ public Response removeFromCluserNodeLabels(Set oldNodeLabels, return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.POST, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.REMOVE_NODE_LABELS, null, - null); + null, client); } @Override @@ -317,7 +323,7 @@ public NodeLabelsInfo getLabelsOnNode(HttpServletRequest hsr, String nodeId) return RouterWebServiceUtil.genericForward(webAppAddress, hsr, NodeLabelsInfo.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.NODES + "/" + nodeId + "/get-labels", - null, null); + null, null, client); } @Override @@ -326,7 +332,7 @@ public AppPriority getAppPriority(HttpServletRequest hsr, String appId) return RouterWebServiceUtil.genericForward(webAppAddress, hsr, AppPriority.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS + "/" + appId + "/" + RMWSConsts.PRIORITY, - null, null); + null, null, client); } @Override @@ -336,7 +342,7 @@ public Response updateApplicationPriority(AppPriority targetPriority, return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.PUT, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS + "/" + appId + "/" + RMWSConsts.PRIORITY, - targetPriority, null); + targetPriority, null, client); } @Override @@ -345,7 +351,7 @@ public AppQueue getAppQueue(HttpServletRequest hsr, String appId) return RouterWebServiceUtil.genericForward(webAppAddress, hsr, AppQueue.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS + "/" + appId + "/" + RMWSConsts.QUEUE, - null, null); + null, null, client); } @Override @@ -355,7 +361,7 @@ public Response updateAppQueue(AppQueue targetQueue, HttpServletRequest hsr, return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.PUT, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS + "/" + appId + "/" + RMWSConsts.QUEUE, - targetQueue, null); + targetQueue, null, client); } @Override @@ -364,7 +370,7 @@ public Response createNewApplication(HttpServletRequest hsr) return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.POST, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS_NEW_APPLICATION, null, - null); + null, client); } @Override @@ -373,7 +379,7 @@ public Response submitApplication(ApplicationSubmissionContextInfo newApp, throws AuthorizationException, IOException, InterruptedException { return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.POST, - RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS, newApp, null); + RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS, newApp, null, client); } @Override @@ -383,7 +389,7 @@ public Response postDelegationToken(DelegationToken tokenData, return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.POST, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.DELEGATION_TOKEN, tokenData, - null); + null, client); } @Override @@ -393,7 +399,7 @@ public Response postDelegationTokenExpiration(HttpServletRequest hsr) return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.POST, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.DELEGATION_TOKEN_EXPIRATION, - null, null); + null, null, client); } @Override @@ -403,7 +409,7 @@ public Response cancelDelegationToken(HttpServletRequest hsr) return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.DELETE, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.DELEGATION_TOKEN, null, - null); + null, client); } @Override @@ -412,7 +418,7 @@ public Response createNewReservation(HttpServletRequest hsr) return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.POST, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.RESERVATION_NEW, null, - null); + null, client); } @Override @@ -422,7 +428,7 @@ public Response submitReservation(ReservationSubmissionRequestInfo resContext, return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.POST, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.RESERVATION_SUBMIT, - resContext, null); + resContext, null, client); } @Override @@ -432,7 +438,7 @@ public Response updateReservation(ReservationUpdateRequestInfo resContext, return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.POST, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.RESERVATION_UPDATE, - resContext, null); + resContext, null, client); } @Override @@ -442,7 +448,7 @@ public Response deleteReservation(ReservationDeleteRequestInfo resContext, return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.POST, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.RESERVATION_DELETE, - resContext, null); + resContext, null, client); } @Override @@ -454,7 +460,7 @@ public Response listReservation(String queue, String reservationId, return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.RESERVATION_LIST, null, - null); + null, client); } @Override @@ -464,7 +470,7 @@ public AppTimeoutInfo getAppTimeout(HttpServletRequest hsr, String appId, .genericForward(webAppAddress, hsr, AppTimeoutInfo.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS + "/" + appId + "/" + RMWSConsts.TIMEOUTS + "/" + type, - null, null); + null, null, client); } @Override @@ -473,7 +479,7 @@ public AppTimeoutsInfo getAppTimeouts(HttpServletRequest hsr, String appId) return RouterWebServiceUtil.genericForward(webAppAddress, hsr, AppTimeoutsInfo.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS + "/" + appId + "/" + RMWSConsts.TIMEOUTS, - null, null); + null, null, client); } @Override @@ -483,7 +489,7 @@ public Response updateApplicationTimeout(AppTimeoutInfo appTimeout, return RouterWebServiceUtil.genericForward(webAppAddress, hsr, Response.class, HTTPMethods.PUT, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS + "/" + appId + "/" + RMWSConsts.TIMEOUT, - appTimeout, null); + appTimeout, null, client); } @Override @@ -491,7 +497,7 @@ public AppAttemptsInfo getAppAttempts(HttpServletRequest hsr, String appId) { return RouterWebServiceUtil.genericForward(webAppAddress, hsr, AppAttemptsInfo.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS + "/" + appId + "/" + RMWSConsts.APPATTEMPTS, - null, null); + null, null, client); } @Override @@ -500,7 +506,7 @@ public RMQueueAclInfo checkUserAccessToQueue(String queue, String username, return RouterWebServiceUtil.genericForward(webAppAddress, hsr, RMQueueAclInfo.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.QUEUES + "/" + queue - + "/access", null, null); + + "/access", null, null, client); } @Override @@ -510,7 +516,7 @@ public AppAttemptInfo getAppAttempt(HttpServletRequest req, AppAttemptInfo.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS + "/" + appId + "/" + RMWSConsts.APPATTEMPTS + "/" + appAttemptId, - null, null); + null, null, client); } @Override @@ -521,7 +527,7 @@ public ContainersInfo getContainers(HttpServletRequest req, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS + "/" + appId + "/" + RMWSConsts.APPATTEMPTS + "/" + appAttemptId + "/" + RMWSConsts.CONTAINERS, - null, null); + null, null, client); } @Override @@ -533,7 +539,7 @@ public ContainerInfo getContainer(HttpServletRequest req, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.APPS + "/" + appId + "/" + RMWSConsts.APPATTEMPTS + "/" + appAttemptId + "/" + RMWSConsts.CONTAINERS + "/" + containerId, - null, null); + null, null, client); } @Override @@ -551,6 +557,6 @@ public Response signalToContainer(String containerId, String command, .genericForward(webAppAddress, req, Response.class, HTTPMethods.POST, RMWSConsts.RM_WEB_SERVICE_PATH + "/" + RMWSConsts.CONTAINERS + "/" + containerId + "/" + RMWSConsts.SIGNAL + "/" + command, null, - null); + null, client); } } \ No newline at end of file diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/NodesBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/NodesBlock.java index 720302e5a0d..36d5209aa61 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/NodesBlock.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/NodesBlock.java @@ -18,6 +18,7 @@ package org.apache.hadoop.yarn.server.router.webapp; +import com.sun.jersey.api.client.Client; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.util.StringUtils; import org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWSConsts; @@ -53,10 +54,13 @@ protected void render(Block html) { // Get the node info from the federation Configuration conf = this.router.getConfig(); + + Client client = RouterWebServiceUtil.createJerseyClient(conf); + String webAppAddress = WebAppUtils.getRouterWebAppURLWithScheme(conf); NodesInfo nodes = RouterWebServiceUtil.genericForward(webAppAddress, null, NodesInfo.class, HTTPMethods.GET, - RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.NODES, null, null); + RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.NODES, null, null, client); setTitle("Nodes"); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/RouterWebServiceUtil.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/RouterWebServiceUtil.java index 40bdbd83c69..39432a773c4 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/RouterWebServiceUtil.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/RouterWebServiceUtil.java @@ -37,8 +37,10 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; +import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.yarn.api.records.YarnApplicationState; +import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWebAppUtil; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppsInfo; @@ -93,7 +95,7 @@ private RouterWebServiceUtil() { final String webApp, final HttpServletRequest hsr, final Class returnType, final HTTPMethods method, final String targetPath, final Object formParam, - final Map additionalParam) { + final Map additionalParam, Client client) { UserGroupInformation callerUGI = null; @@ -128,7 +130,7 @@ public T run() { ClientResponse response = RouterWebServiceUtil.invokeRMWebService( webApp, targetPath, method, (hsr == null) ? null : hsr.getPathInfo(), paramMap, formParam, - getMediaTypeFromHttpServletRequest(hsr, returnType)); + getMediaTypeFromHttpServletRequest(hsr, returnType), client); if (Response.class.equals(returnType)) { return (T) RouterWebServiceUtil.clientResponseToResponse(response); } @@ -161,9 +163,8 @@ public T run() { */ private static ClientResponse invokeRMWebService(String webApp, String path, HTTPMethods method, String additionalPath, - Map queryParams, Object formParam, String mediaType) { - Client client = Client.create(); - + Map queryParams, Object formParam, String mediaType, + Client client) { WebResource webResource = client.resource(webApp).path(path); if (additionalPath != null && !additionalPath.isEmpty()) { @@ -461,4 +462,17 @@ public static void mergeMetrics(ClusterMetricsInfo metrics, return header; } + /** + * Create a Jersey client instance. + */ + protected static Client createJerseyClient(Configuration conf) { + Client client = Client.create(); + client.setConnectTimeout( + conf.getInt(YarnConfiguration.ROUTER_WEBAPP_CONNECT_TIMEOUT_MS, + YarnConfiguration.DEFAULT_ROUTER_WEBAPP_CONNECT_TIMEOUT_MS)); + client.setReadTimeout( + conf.getInt(YarnConfiguration.ROUTER_WEBAPP_READ_TIMEOUT_MS, + YarnConfiguration.DEFAULT_ROUTER_WEBAPP_READ_TIMEOUT_MS)); + return client; + } }