Przeglądaj źródła

YARN-7760. [UI2] Clicking 'Master Node' or link next to 'AM Node Web UI' under application's appAttempt page goes to OLD RM UI. (Vasudevan Skm / Sunil G via wangda)

Change-Id: Ia7e2b955d3551ca43c6852fe253fd01983b56565
Wangda Tan 7 lat temu
rodzic
commit
75618c0dec

+ 11 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/AppInfo.java

@@ -92,6 +92,7 @@ public class AppInfo {
   protected String amContainerLogs;
   protected String amContainerLogs;
   protected String amHostHttpAddress;
   protected String amHostHttpAddress;
   private String amRPCAddress;
   private String amRPCAddress;
+  private String masterNodeId;
   private long allocatedMB;
   private long allocatedMB;
   private long allocatedVCores;
   private long allocatedVCores;
   private long reservedMB;
   private long reservedMB;
@@ -162,6 +163,7 @@ public class AppInfo {
       this.name = app.getName().toString();
       this.name = app.getName().toString();
       this.queue = app.getQueue().toString();
       this.queue = app.getQueue().toString();
       this.priority = 0;
       this.priority = 0;
+      this.masterNodeId = "";
 
 
       if (app.getApplicationPriority() != null) {
       if (app.getApplicationPriority() != null) {
         this.priority = app.getApplicationPriority().getPriority();
         this.priority = app.getApplicationPriority().getPriority();
@@ -192,6 +194,7 @@ public class AppInfo {
                 schemePrefix + masterContainer.getNodeHttpAddress(),
                 schemePrefix + masterContainer.getNodeHttpAddress(),
                 masterContainer.getId().toString(), app.getUser());
                 masterContainer.getId().toString(), app.getUser());
             this.amHostHttpAddress = masterContainer.getNodeHttpAddress();
             this.amHostHttpAddress = masterContainer.getNodeHttpAddress();
+            this.masterNodeId = masterContainer.getNodeId().toString();
           }
           }
 
 
           this.amRPCAddress = getAmRPCAddressFromRMAppAttempt(attempt);
           this.amRPCAddress = getAmRPCAddressFromRMAppAttempt(attempt);
@@ -615,4 +618,12 @@ public class AppInfo {
   public void setName(String name) {
   public void setName(String name) {
     this.name = name;
     this.name = name;
   }
   }
+
+  public String getMasterNodeId() {
+    return masterNodeId;
+  }
+
+  public void setMasterNodeId(String masterNodeId) {
+    this.masterNodeId = masterNodeId;
+  }
 }
 }

+ 1 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesApps.java

@@ -1603,7 +1603,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void verifyAppInfo(JSONObject info, RMApp app, boolean hasResourceReqs)
   public void verifyAppInfo(JSONObject info, RMApp app, boolean hasResourceReqs)
       throws JSONException, Exception {
       throws JSONException, Exception {
 
 
-    int expectedNumberOfElements = 38 + (hasResourceReqs ? 2 : 0);
+    int expectedNumberOfElements = 39 + (hasResourceReqs ? 2 : 0);
     String appNodeLabelExpression = null;
     String appNodeLabelExpression = null;
     String amNodeLabelExpression = null;
     String amNodeLabelExpression = null;
     if (app.getApplicationSubmissionContext()
     if (app.getApplicationSubmissionContext()

+ 56 - 40
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app.js

@@ -20,42 +20,43 @@ import Converter from 'yarn-ui/utils/converter';
 import DS from 'ember-data';
 import DS from 'ember-data';
 
 
 export default DS.Model.extend({
 export default DS.Model.extend({
-  appName: DS.attr('string'),
-  user: DS.attr('string'),
-  queue: DS.attr('string'),
-  state: DS.attr('string'),
-  startTime: DS.attr('string'),
-  elapsedTime: DS.attr('string'),
-  finalStatus: DS.attr('string'),
-  finishedTime: DS.attr('finishedTime'),
-  progress: DS.attr('number'),
-  diagnostics: DS.attr('string'),
-  amContainerLogs: DS.attr('string'),
-  amHostHttpAddress: DS.attr('string'),
-  logAggregationStatus: DS.attr('string'),
-  unmanagedApplication: DS.attr('boolean'),
-  amNodeLabelExpression: DS.attr('string'),
-  applicationTags: DS.attr('string'),
-  applicationType: DS.attr('string'),
-  priority: DS.attr('string'),
-  allocatedMB: DS.attr('number'),
-  allocatedVCores: DS.attr('number'),
-  runningContainers: DS.attr('number'),
-  memorySeconds: DS.attr('number'),
-  vcoreSeconds: DS.attr('number'),
-  preemptedResourceMB: DS.attr('number'),
-  preemptedResourceVCores: DS.attr('number'),
-  numNonAMContainerPreempted: DS.attr('number'),
-  numAMContainerPreempted: DS.attr('number'),
-  clusterUsagePercentage: DS.attr('number'),
-  queueUsagePercentage: DS.attr('number'),
-  currentAppAttemptId: DS.attr('string'),
-  remainingTimeoutInSeconds: DS.attr('number'),
-  applicationExpiryTime: DS.attr('string'),
-  resourceRequests: DS.attr('array'),
+  appName: DS.attr("string"),
+  user: DS.attr("string"),
+  queue: DS.attr("string"),
+  state: DS.attr("string"),
+  startTime: DS.attr("string"),
+  elapsedTime: DS.attr("string"),
+  finalStatus: DS.attr("string"),
+  finishedTime: DS.attr("finishedTime"),
+  progress: DS.attr("number"),
+  diagnostics: DS.attr("string"),
+  amContainerLogs: DS.attr("string"),
+  amHostHttpAddress: DS.attr("string"),
+  masterNodeId: DS.attr("string"),
+  logAggregationStatus: DS.attr("string"),
+  unmanagedApplication: DS.attr("boolean"),
+  amNodeLabelExpression: DS.attr("string"),
+  applicationTags: DS.attr("string"),
+  applicationType: DS.attr("string"),
+  priority: DS.attr("string"),
+  allocatedMB: DS.attr("number"),
+  allocatedVCores: DS.attr("number"),
+  runningContainers: DS.attr("number"),
+  memorySeconds: DS.attr("number"),
+  vcoreSeconds: DS.attr("number"),
+  preemptedResourceMB: DS.attr("number"),
+  preemptedResourceVCores: DS.attr("number"),
+  numNonAMContainerPreempted: DS.attr("number"),
+  numAMContainerPreempted: DS.attr("number"),
+  clusterUsagePercentage: DS.attr("number"),
+  queueUsagePercentage: DS.attr("number"),
+  currentAppAttemptId: DS.attr("string"),
+  remainingTimeoutInSeconds: DS.attr("number"),
+  applicationExpiryTime: DS.attr("string"),
+  resourceRequests: DS.attr("array"),
 
 
   isFailed: function() {
   isFailed: function() {
-    return this.get('finalStatus') === "FAILED";
+    return this.get("finalStatus") === "FAILED";
   }.property("finalStatus"),
   }.property("finalStatus"),
 
 
   validatedFinishedTs: function() {
   validatedFinishedTs: function() {
@@ -70,27 +71,42 @@ export default DS.Model.extend({
   }.property("hasFinishedTime"),
   }.property("hasFinishedTime"),
 
 
   formattedElapsedTime: function() {
   formattedElapsedTime: function() {
-    return Converter.msToElapsedTimeUnit(this.get('elapsedTime'));
-  }.property('elapsedTime'),
+    return Converter.msToElapsedTimeUnit(this.get("elapsedTime"));
+  }.property("elapsedTime"),
 
 
   allocatedResource: function() {
   allocatedResource: function() {
-    return Converter.resourceToString(this.get("allocatedMB"), this.get("allocatedVCores"));
+    return Converter.resourceToString(
+      this.get("allocatedMB"),
+      this.get("allocatedVCores")
+    );
   }.property("allocatedMB", "allocatedVCores"),
   }.property("allocatedMB", "allocatedVCores"),
 
 
   preemptedResource: function() {
   preemptedResource: function() {
-    return Converter.resourceToString(this.get("preemptedResourceMB"), this.get("preemptedResourceVCores"));
+    return Converter.resourceToString(
+      this.get("preemptedResourceMB"),
+      this.get("preemptedResourceVCores")
+    );
   }.property("preemptedResourceMB", "preemptedResourceVCores"),
   }.property("preemptedResourceMB", "preemptedResourceVCores"),
 
 
   aggregatedResourceUsage: function() {
   aggregatedResourceUsage: function() {
-    return Converter.resourceToString(this.get("memorySeconds"), this.get("vcoreSeconds")) + " (× Secs)";
+    return (
+      Converter.resourceToString(
+        this.get("memorySeconds"),
+        this.get("vcoreSeconds")
+      ) + " (× Secs)"
+    );
   }.property("memorySeconds", "vcoreSeconds"),
   }.property("memorySeconds", "vcoreSeconds"),
 
 
+  masterNodeURL: function() {
+    return `#/yarn-node/${this.get("masterNodeId")}/${this.get("amHostHttpAddress")}/info/`;
+  }.property("masterNodeId", "amHostHttpAddress"),
+
   progressStyle: function() {
   progressStyle: function() {
     return "width: " + this.get("progress") + "%";
     return "width: " + this.get("progress") + "%";
   }.property("progress"),
   }.property("progress"),
 
 
   runningContainersNumber: function() {
   runningContainersNumber: function() {
-    if(this.get("runningContainers") < 0) {
+    if (this.get("runningContainers") < 0) {
       return 0;
       return 0;
     }
     }
     return this.get("runningContainers");
     return this.get("runningContainers");

+ 1 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app.js

@@ -51,6 +51,7 @@ export default DS.JSONAPISerializer.extend({
           diagnostics: (payload.diagnostics && payload.diagnostics !== 'null')? payload.diagnostics : '',
           diagnostics: (payload.diagnostics && payload.diagnostics !== 'null')? payload.diagnostics : '',
           amContainerLogs: payload.amContainerLogs,
           amContainerLogs: payload.amContainerLogs,
           amHostHttpAddress: payload.amHostHttpAddress,
           amHostHttpAddress: payload.amHostHttpAddress,
+          masterNodeId: payload.masterNodeId,
           logAggregationStatus: payload.logAggregationStatus,
           logAggregationStatus: payload.logAggregationStatus,
           unmanagedApplication: payload.unmanagedApplication,
           unmanagedApplication: payload.unmanagedApplication,
           amNodeLabelExpression: payload.amNodeLabelExpression,
           amNodeLabelExpression: payload.amNodeLabelExpression,

+ 1 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app.hbs

@@ -65,7 +65,7 @@
         <div class="flex-right">
         <div class="flex-right">
           <div class="links">
           <div class="links">
             <a href="{{model.app.amContainerLogs}}" target="_blank">Master Container Log</a> &nbsp;|&nbsp;
             <a href="{{model.app.amContainerLogs}}" target="_blank">Master Container Log</a> &nbsp;|&nbsp;
-            <a href="{{amHostHttpAddressFormatted}}" target="_blank">Master Node</a>  &nbsp;|&nbsp;
+            <a href="{{model.app.masterNodeURL}}">Master Node</a> &nbsp;|&nbsp;
             {{#if isRunningService}}
             {{#if isRunningService}}
               <div class="btn-group">
               <div class="btn-group">
                 <button type="button" class="btn btn-unstyled dropdown-toggle" title="Settings" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                 <button type="button" class="btn btn-unstyled dropdown-toggle" title="Settings" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">