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 2021/06/08 15:58:41 UTC
[hadoop] branch trunk updated: YARN-10792. Set Completed AppAttempt
LogsLink to Log Server URL. Contributed by Abhinaba Sarkar
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 9445abb YARN-10792. Set Completed AppAttempt LogsLink to Log Server URL. Contributed by Abhinaba Sarkar
9445abb is described below
commit 9445abb500530d5988346c2c8515f5f85553301e
Author: Prabhu Josephraj <pj...@microsoft.com>
AuthorDate: Tue Jun 8 20:37:40 2021 +0530
YARN-10792. Set Completed AppAttempt LogsLink to Log Server URL. Contributed by Abhinaba Sarkar
---
.../resourcemanager/webapp/dao/AppAttemptInfo.java | 26 +++++++++++---
.../webapp/TestRMWebServicesAppAttempts.java | 40 ++++++++++++++++++++++
2 files changed, 61 insertions(+), 5 deletions(-)
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/dao/AppAttemptInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/AppAttemptInfo.java
index 00454af..499d4e1 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/AppAttemptInfo.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/AppAttemptInfo.java
@@ -23,7 +23,9 @@ import javax.xml.bind.annotation.XmlRootElement;
import com.google.gson.Gson;
import org.apache.commons.lang3.StringUtils;
+import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.yarn.api.records.Container;
+import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt;
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptState;
@@ -31,6 +33,8 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.AbstractYarnSched
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerApplicationAttempt;
import org.apache.hadoop.yarn.webapp.util.WebAppUtils;
+import static org.apache.hadoop.yarn.util.StringHelper.PATH_JOINER;
+
@XmlRootElement(name = "appAttempt")
@XmlAccessorType(XmlAccessType.FIELD)
public class AppAttemptInfo {
@@ -64,15 +68,29 @@ public class AppAttemptInfo {
this.id = attempt.getAppAttemptId().getAttemptId();
this.startTime = attempt.getStartTime();
this.finishedTime = attempt.getFinishTime();
+ this.appAttemptState = attempt.getAppAttemptState();
+ this.appAttemptId = attempt.getAppAttemptId().toString();
Container masterContainer = attempt.getMasterContainer();
if (masterContainer != null && hasAccess) {
this.containerId = masterContainer.getId().toString();
this.nodeHttpAddress = masterContainer.getNodeHttpAddress();
this.nodeId = masterContainer.getNodeId().toString();
- this.logsLink = WebAppUtils.getRunningLogURL(schemePrefix
- + masterContainer.getNodeHttpAddress(),
- masterContainer.getId().toString(), user);
+ Configuration conf = rm.getRMContext().getYarnConfiguration();
+ String logServerUrl = conf.get(YarnConfiguration.YARN_LOG_SERVER_URL);
+ if ((this.appAttemptState == RMAppAttemptState.FAILED ||
+ this.appAttemptState == RMAppAttemptState.FINISHED ||
+ this.appAttemptState == RMAppAttemptState.KILLED) &&
+ logServerUrl != null) {
+ this.logsLink = PATH_JOINER.join(logServerUrl,
+ masterContainer.getNodeId().toString(),
+ masterContainer.getId().toString(),
+ masterContainer.getId().toString(), user);
+ } else {
+ this.logsLink = WebAppUtils.getRunningLogURL(schemePrefix
+ + masterContainer.getNodeHttpAddress(),
+ masterContainer.getId().toString(), user);
+ }
Gson gson = new Gson();
this.exportPorts = gson.toJson(masterContainer.getExposedPorts());
@@ -90,8 +108,6 @@ public class AppAttemptInfo {
}
}
}
- this.appAttemptId = attempt.getAppAttemptId().toString();
- this.appAttemptState = attempt.getAppAttemptState();
}
}
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesAppAttempts.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesAppAttempts.java
index df168f7..102f138 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesAppAttempts.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesAppAttempts.java
@@ -60,6 +60,7 @@ import java.util.Collection;
import static org.apache.hadoop.yarn.webapp.WebServicesTestUtils.assertResponseStatusCode;
import static org.apache.hadoop.yarn.webapp.WebServicesTestUtils.checkStringMatch;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -125,6 +126,45 @@ public class TestRMWebServicesAppAttempts extends JerseyTestBase {
}
@Test (timeout = 20000)
+ public void testCompletedAppAttempt() throws Exception {
+ Configuration conf = rm.getConfig();
+ String logServerUrl = "http://localhost:19888/jobhistory/logs";
+ conf.set(YarnConfiguration.YARN_LOG_SERVER_URL, logServerUrl);
+ conf.setInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS, 1);
+ rm.start();
+ MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 8192);
+ MockRMAppSubmissionData data =
+ MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+ .withAppName("testwordcount")
+ .withUser("user1")
+ .build();
+ RMApp app1 = MockRMAppSubmitter.submit(rm, data);
+ MockAM am = MockRM.launchAndRegisterAM(app1, rm, amNodeManager);
+ // fail the AM by sending CONTAINER_FINISHED event without registering.
+ amNodeManager.nodeHeartbeat(am.getApplicationAttemptId(), 1,
+ ContainerState.COMPLETE);
+ rm.waitForState(am.getApplicationAttemptId(), RMAppAttemptState.FAILED);
+ rm.waitForState(app1.getApplicationId(), RMAppState.FAILED);
+
+ WebResource r = resource();
+ ClientResponse response = r.path("ws").path("v1").path("cluster")
+ .path("apps").path(app1.getApplicationId().toString())
+ .path("appattempts").accept(MediaType.APPLICATION_JSON)
+ .get(ClientResponse.class);
+ JSONObject json = response.getEntity(JSONObject.class);
+ JSONObject jsonAppAttempts = json.getJSONObject("appAttempts");
+ JSONArray jsonArray = jsonAppAttempts.getJSONArray("appAttempt");
+ JSONObject info = jsonArray.getJSONObject(0);
+ String logsLink = info.getString("logsLink");
+ String containerId = app1.getCurrentAppAttempt().getMasterContainer()
+ .getId().toString();
+ assertThat(logsLink).isEqualTo(logServerUrl
+ + "/127.0.0.1:1234/" + containerId + "/" + containerId + "/"
+ + "user1");
+ rm.stop();
+ }
+
+ @Test (timeout = 20000)
public void testMultipleAppAttempts() throws Exception {
rm.start();
MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 8192);
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org