YARN-4609. RM Nodes list page takes too much time to load. Contributed by Bibin A Chundatt
This commit is contained in:
parent
552237d4a3
commit
776b549e2a
@ -18,8 +18,8 @@
|
||||
|
||||
package org.apache.hadoop.yarn.server.resourcemanager.webapp;
|
||||
|
||||
import static org.apache.hadoop.yarn.webapp.YarnWebParams.NODE_STATE;
|
||||
import static org.apache.hadoop.yarn.webapp.YarnWebParams.NODE_LABEL;
|
||||
import static org.apache.hadoop.yarn.webapp.YarnWebParams.NODE_STATE;
|
||||
import static org.apache.hadoop.yarn.webapp.view.JQueryUI.DATATABLES;
|
||||
import static org.apache.hadoop.yarn.webapp.view.JQueryUI.DATATABLES_ID;
|
||||
import static org.apache.hadoop.yarn.webapp.view.JQueryUI.initID;
|
||||
@ -40,7 +40,6 @@
|
||||
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
|
||||
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TABLE;
|
||||
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TBODY;
|
||||
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TR;
|
||||
import org.apache.hadoop.yarn.webapp.view.HtmlBlock;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
@ -101,6 +100,7 @@ protected void render(Block html) {
|
||||
LOG.debug("Unexpected state filter for inactive RM node");
|
||||
}
|
||||
}
|
||||
StringBuilder nodeTableData = new StringBuilder("[\n");
|
||||
for (RMNode ni : rmNodes) {
|
||||
if (stateFilter != null) {
|
||||
NodeState state = ni.getState();
|
||||
@ -129,27 +129,40 @@ protected void render(Block html) {
|
||||
NodeInfo info = new NodeInfo(ni, sched);
|
||||
int usedMemory = (int) info.getUsedMemory();
|
||||
int availableMemory = (int) info.getAvailableMemory();
|
||||
TR<TBODY<TABLE<Hamlet>>> row =
|
||||
tbody.tr().td(StringUtils.join(",", info.getNodeLabels()))
|
||||
.td(info.getRack()).td(info.getState()).td(info.getNodeId());
|
||||
nodeTableData.append("[\"")
|
||||
.append(StringUtils.join(",", info.getNodeLabels())).append("\",\"")
|
||||
.append(info.getRack()).append("\",\"").append(info.getState())
|
||||
.append("\",\"").append(info.getNodeId());
|
||||
if (isInactive) {
|
||||
row.td()._("N/A")._();
|
||||
nodeTableData.append("\",\"").append("N/A").append("\",\"");
|
||||
} else {
|
||||
String httpAddress = info.getNodeHTTPAddress();
|
||||
row.td().a("//" + httpAddress, httpAddress)._();
|
||||
nodeTableData.append("\",\"<a ").append("href='" + "//" + httpAddress)
|
||||
.append("'>").append(httpAddress).append("</a>\",").append("\"");
|
||||
}
|
||||
row.td().br().$title(String.valueOf(info.getLastHealthUpdate()))._()
|
||||
._(Times.format(info.getLastHealthUpdate()))._()
|
||||
.td(info.getHealthReport())
|
||||
.td(String.valueOf(info.getNumContainers())).td().br()
|
||||
.$title(String.valueOf(usedMemory))._()
|
||||
._(StringUtils.byteDesc(usedMemory * BYTES_IN_MB))._().td().br()
|
||||
.$title(String.valueOf(availableMemory))._()
|
||||
._(StringUtils.byteDesc(availableMemory * BYTES_IN_MB))._()
|
||||
.td(String.valueOf(info.getUsedVirtualCores()))
|
||||
.td(String.valueOf(info.getAvailableVirtualCores()))
|
||||
.td(ni.getNodeManagerVersion())._();
|
||||
nodeTableData.append("<br title='")
|
||||
.append(String.valueOf(info.getLastHealthUpdate())).append("'>")
|
||||
.append(Times.format(info.getLastHealthUpdate())).append("\",\"")
|
||||
.append(info.getHealthReport()).append("\",\"")
|
||||
.append(String.valueOf(info.getNumContainers())).append("\",\"")
|
||||
.append("<br title='").append(String.valueOf(usedMemory))
|
||||
.append("'>").append(StringUtils.byteDesc(usedMemory * BYTES_IN_MB))
|
||||
.append("\",\"").append("<br title='")
|
||||
.append(String.valueOf(availableMemory)).append("'>")
|
||||
.append(StringUtils.byteDesc(availableMemory * BYTES_IN_MB))
|
||||
.append("\",\"").append(String.valueOf(info.getUsedVirtualCores()))
|
||||
.append("\",\"")
|
||||
.append(String.valueOf(info.getAvailableVirtualCores()))
|
||||
.append("\",\"").append(ni.getNodeManagerVersion())
|
||||
.append("\"],\n");
|
||||
}
|
||||
if (nodeTableData.charAt(nodeTableData.length() - 2) == ',') {
|
||||
nodeTableData.delete(nodeTableData.length() - 2,
|
||||
nodeTableData.length() - 1);
|
||||
}
|
||||
nodeTableData.append("]");
|
||||
html.script().$type("text/javascript")
|
||||
._("var nodeTableData=" + nodeTableData)._();
|
||||
tbody._()._();
|
||||
}
|
||||
}
|
||||
@ -175,7 +188,9 @@ protected Class<? extends SubView> content() {
|
||||
}
|
||||
|
||||
private String nodesTableInit() {
|
||||
StringBuilder b = tableInit().append(", aoColumnDefs: [");
|
||||
StringBuilder b = tableInit().append(", 'aaData': nodeTableData")
|
||||
.append(", bDeferRender: true").append(", bProcessing: true")
|
||||
.append(", aoColumnDefs: [");
|
||||
b.append("{'bSearchable': false, 'aTargets': [ 7 ]}");
|
||||
b.append(", {'sType': 'title-numeric', 'bSearchable': false, "
|
||||
+ "'aTargets': [ 8, 9 ] }");
|
||||
|
@ -81,11 +81,8 @@ public void testNodesBlockRender() throws Exception {
|
||||
Mockito.verify(writer,
|
||||
Mockito.times(numberOfActualTableHeaders + numberOfThInMetricsTable))
|
||||
.print("<th");
|
||||
Mockito.verify(
|
||||
writer,
|
||||
Mockito.times(numberOfRacks * numberOfNodesPerRack
|
||||
* numberOfActualTableHeaders + numberOfThInMetricsTable)).print(
|
||||
"<td");
|
||||
Mockito.verify(writer, Mockito.times(numberOfThInMetricsTable))
|
||||
.print("<td");
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -99,11 +96,8 @@ public void testNodesBlockRenderForLostNodes() {
|
||||
Mockito.verify(writer,
|
||||
Mockito.times(numberOfActualTableHeaders + numberOfThInMetricsTable))
|
||||
.print("<th");
|
||||
Mockito.verify(
|
||||
writer,
|
||||
Mockito.times(numberOfRacks * numberOfLostNodesPerRack
|
||||
* numberOfActualTableHeaders + numberOfThInMetricsTable)).print(
|
||||
"<td");
|
||||
Mockito.verify(writer, Mockito.times(numberOfThInMetricsTable))
|
||||
.print("<td");
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -113,12 +107,9 @@ public void testNodesBlockRenderForNodeLabelFilterWithNonEmptyLabel() {
|
||||
nodesBlock.render();
|
||||
PrintWriter writer = injector.getInstance(PrintWriter.class);
|
||||
WebAppTests.flushOutput(injector);
|
||||
|
||||
Mockito.verify(
|
||||
writer,
|
||||
Mockito.times(numberOfRacks
|
||||
* numberOfActualTableHeaders + numberOfThInMetricsTable)).print(
|
||||
"<td");
|
||||
Mockito.verify(writer, Mockito.times(numberOfThInMetricsTable))
|
||||
.print("<td");
|
||||
Mockito.verify(writer, Mockito.times(1)).print("<script");
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -129,11 +120,8 @@ public void testNodesBlockRenderForNodeLabelFilterWithEmptyLabel() {
|
||||
PrintWriter writer = injector.getInstance(PrintWriter.class);
|
||||
WebAppTests.flushOutput(injector);
|
||||
|
||||
Mockito.verify(
|
||||
writer,
|
||||
Mockito.times(numberOfRacks * (numberOfNodesPerRack - 1)
|
||||
* numberOfActualTableHeaders + numberOfThInMetricsTable)).print(
|
||||
"<td");
|
||||
Mockito.verify(writer, Mockito.times(numberOfThInMetricsTable))
|
||||
.print("<td");
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -144,10 +132,7 @@ public void testNodesBlockRenderForNodeLabelFilterWithAnyLabel() {
|
||||
PrintWriter writer = injector.getInstance(PrintWriter.class);
|
||||
WebAppTests.flushOutput(injector);
|
||||
|
||||
Mockito.verify(
|
||||
writer,
|
||||
Mockito.times(numberOfRacks * numberOfNodesPerRack
|
||||
* numberOfActualTableHeaders + numberOfThInMetricsTable)).print(
|
||||
"<td");
|
||||
Mockito.verify(writer, Mockito.times(numberOfThInMetricsTable))
|
||||
.print("<td");
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user