From 4c0e235e2b11b5abe2bcf072702049114e4844c1 Mon Sep 17 00:00:00 2001 From: zhangjunjie Date: Sun, 4 Dec 2022 23:23:36 +0800 Subject: [PATCH] Revert "delete applciation gpg method" This reverts commit 7ada6f13900524bec724b69bd6e5f58904185550. --- .../globalpolicygenerator/GPGUtils.java | 15 ++- .../ApplicationCleaner.java | 25 ++++- .../CustomizeApplicationCleaner.java | 93 +++++++++++++++++++ 3 files changed, 128 insertions(+), 5 deletions(-) create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-globalpolicygenerator/src/main/java/org/apache/hadoop/yarn/server/globalpolicygenerator/applicationcleaner/CustomizeApplicationCleaner.java diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-globalpolicygenerator/src/main/java/org/apache/hadoop/yarn/server/globalpolicygenerator/GPGUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-globalpolicygenerator/src/main/java/org/apache/hadoop/yarn/server/globalpolicygenerator/GPGUtils.java index 4317b19d84..27218f5beb 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-globalpolicygenerator/src/main/java/org/apache/hadoop/yarn/server/globalpolicygenerator/GPGUtils.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-globalpolicygenerator/src/main/java/org/apache/hadoop/yarn/server/globalpolicygenerator/GPGUtils.java @@ -19,6 +19,7 @@ package org.apache.hadoop.yarn.server.globalpolicygenerator; import static javax.servlet.http.HttpServletResponse.SC_OK; +import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR; import java.util.HashMap; import java.util.Map; @@ -27,7 +28,6 @@ import java.util.Set; import javax.ws.rs.core.MediaType; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; import org.apache.hadoop.yarn.server.federation.store.records.SubClusterId; import org.apache.hadoop.yarn.server.federation.store.records.SubClusterIdInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWSConsts; @@ -35,12 +35,18 @@ import org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWSConsts; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * GPGUtils contains utility functions for the GPG. */ public final class GPGUtils { + private static final Logger LOG = + LoggerFactory.getLogger(GPGUtils.class); + // hide constructor private GPGUtils() { } @@ -64,10 +70,11 @@ public final class GPGUtils { .get(ClientResponse.class); if (response.getStatus() == SC_OK) { obj = response.getEntity(returnType); + } else if (response.getStatus() == SC_INTERNAL_SERVER_ERROR) { + LOG.error("Bad response from remote web service: " + response.getStatus()); } else { - throw new YarnRuntimeException( - "Bad response from remote web service: " + response.getStatus()); - + LOG.error("Unknown exception response from webUI: " + response.getStatus()); + obj = (T) new AppInfo(); } return obj; } finally { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-globalpolicygenerator/src/main/java/org/apache/hadoop/yarn/server/globalpolicygenerator/applicationcleaner/ApplicationCleaner.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-globalpolicygenerator/src/main/java/org/apache/hadoop/yarn/server/globalpolicygenerator/applicationcleaner/ApplicationCleaner.java index 2c49b005c9..7211de7420 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-globalpolicygenerator/src/main/java/org/apache/hadoop/yarn/server/globalpolicygenerator/applicationcleaner/ApplicationCleaner.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-globalpolicygenerator/src/main/java/org/apache/hadoop/yarn/server/globalpolicygenerator/applicationcleaner/ApplicationCleaner.java @@ -20,7 +20,6 @@ package org.apache.hadoop.yarn.server.globalpolicygenerator.applicationcleaner; import java.util.HashSet; import java.util.Set; - import org.apache.commons.lang3.time.DurationFormatUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.yarn.api.records.ApplicationId; @@ -149,6 +148,30 @@ public abstract class ApplicationCleaner implements Runnable { + " success Router queries after " + totalAttemptCount + " retries"); } + + /** + * Query RM for applications + * + * + * + * @return the set of applications + * @throws YarnRuntimeException when router call fails + */ + + public Boolean isAppFromRM(String webAppAddress, ApplicationId applicationId) throws YarnRuntimeException { + + LOG.info("Contacting RM WebUI at: http://{}", webAppAddress); + AppInfo appInfo = (AppInfo) GPGUtils.invokeRMWebService(conf, + "http://" + webAppAddress, "apps/" + applicationId, AppInfo.class, + DeSelectFields.DeSelectType.RESOURCE_REQUESTS.toString()); + + if (appInfo != null) { + LOG.debug("appInfo: {}; appInfo.appId: {}", appInfo, appInfo.getAppId()); + return true; + } + return false; + } + @Override public abstract void run(); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-globalpolicygenerator/src/main/java/org/apache/hadoop/yarn/server/globalpolicygenerator/applicationcleaner/CustomizeApplicationCleaner.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-globalpolicygenerator/src/main/java/org/apache/hadoop/yarn/server/globalpolicygenerator/applicationcleaner/CustomizeApplicationCleaner.java new file mode 100644 index 0000000000..9a63ef0f3c --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-globalpolicygenerator/src/main/java/org/apache/hadoop/yarn/server/globalpolicygenerator/applicationcleaner/CustomizeApplicationCleaner.java @@ -0,0 +1,93 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.yarn.server.globalpolicygenerator.applicationcleaner; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.hadoop.yarn.server.federation.store.records.ApplicationHomeSubCluster; +import org.apache.hadoop.yarn.server.federation.store.records.SubClusterId; +import org.apache.hadoop.yarn.server.federation.store.records.SubClusterInfo; +import org.apache.hadoop.yarn.server.federation.utils.FederationStateStoreFacade; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The default ApplicationCleaner that cleans up old applications from table + * applicationsHomeSubCluster in FederationStateStore. + */ +public class CustomizeApplicationCleaner extends ApplicationCleaner { + private static final Logger LOG = + LoggerFactory.getLogger(CustomizeApplicationCleaner.class); + + @Override + public void run() { + Date now = new Date(); + LOG.info("Application cleaner run at time {}", now); + + FederationStateStoreFacade facade = getGPGContext().getStateStoreFacade(); + try { + + // 获取 zk 上的节点信息 + List response = + facade.getApplicationsHomeSubCluster(); + LOG.info("{} app entries in FederationStateStore", response.size()); + + Map subClusters = facade.getSubClusters(true); + Set subClusterIds = subClusters.keySet(); + + for (ApplicationHomeSubCluster app : response) { + // 获取到 appid + LOG.info("appid: {}", app.getApplicationId().toString()); + + String webAppAddress = null; + if (subClusterIds.contains(app.getHomeSubCluster())) { + webAppAddress = subClusters.get(app.getHomeSubCluster()) + .getRMWebServiceAddress(); + } + + // 获取 webUI api 的节点信息, 查看 appid 是否存在于 RM webUI 中 + boolean isAppIDinRM = isAppFromRM(webAppAddress, app.getApplicationId()); + + // 如果 appid 不存在于 RM 中,就需要对 zk 中的 appid 记录进行删除操作 + if (!isAppIDinRM) { + LOG.info( + "wheater the RM WebUI containers appid: {}, Deleting appid [{}] from statestore. ", + isAppIDinRM, app.getApplicationId()); + + try { + facade.deleteApplicationHomeSubCluster(app.getApplicationId()); + } catch (Exception e) { + LOG.error( + "deleteApplicationHomeSubCluster failed at application " + + app.getApplicationId(), + e); + } + } else { + LOG.info("wheater the RM WebUI containers appid: {}, skipping this AppId: {}. ", + isAppIDinRM, app.getApplicationId()); + } + } + } catch (Throwable e) { + LOG.error("Application cleaner started at time " + now + " fails: ", e); + } + } + +} \ No newline at end of file -- 2.24.3 (Apple Git-128)