in hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/NodesPage.java [69:275]
protected void render(Block html) {
html.__(MetricsOverviewTable.class);
ResourceScheduler sched = rm.getResourceScheduler();
String type = $(NODE_STATE);
String labelFilter = $(NODE_LABEL, CommonNodeLabelsManager.ANY).trim();
Hamlet.TR<Hamlet.THEAD<TABLE<Hamlet>>> trbody =
html.table("#nodes").thead().tr()
.th(".nodelabels", "Node Labels")
.th(".rack", "Rack")
.th(".state", "Node State")
.th(".nodeaddress", "Node Address")
.th(".nodehttpaddress", "Node HTTP Address")
.th(".lastHealthUpdate", "Last health-update")
.th(".healthReport", "Health-report");
if (!this.opportunisticContainersEnabled) {
trbody.th(".containers", "Containers")
.th(".allocationTags", "Allocation Tags")
.th(".mem", "Mem Used")
.th(".mem", "Mem Avail")
.th(".mem", "Mem Total")
.th(".mem", "Phys Mem Used %")
.th(".vcores", "VCores Used")
.th(".vcores", "VCores Avail")
.th(".vcores", "VCores Total")
.th(".vcores", "Phys VCores Used %");
} else {
trbody.th(".containers", "Running Containers (G)")
.th(".allocationTags", "Allocation Tags")
.th(".mem", "Mem Used (G)")
.th(".mem", "Mem Avail (G)")
.th(".mem", "Mem Total")
.th(".mem", "Phys Mem Used %")
.th(".vcores", "VCores Used (G)")
.th(".vcores", "VCores Avail (G)")
.th(".vcores", "VCores Total")
.th(".vcores", "Phys VCores Used %")
.th(".containers", "Running Containers (O)")
.th(".mem", "Mem Used (O)")
.th(".vcores", "VCores Used (O)")
.th(".containers", "Queued Containers");
}
for (Map.Entry<String, Integer> integerEntry :
ResourceUtils.getResourceTypeIndex().entrySet()) {
if (integerEntry.getKey().equals(ResourceInformation.MEMORY_URI)
|| integerEntry.getKey().equals(ResourceInformation.VCORES_URI)) {
continue;
}
trbody.th("." + integerEntry.getKey(),
integerEntry.getKey() + " " + "Used");
trbody.th("." + integerEntry.getKey(),
integerEntry.getKey() + " " + "Avail");
}
TBODY<TABLE<Hamlet>> tbody =
trbody.th(".nodeManagerVersion", "Version").__().__().tbody();
NodeState stateFilter = null;
if (type != null && !type.isEmpty()) {
stateFilter = NodeState.valueOf(StringUtils.toUpperCase(type));
}
Collection<RMNode> rmNodes = this.rm.getRMContext().getRMNodes().values();
boolean isInactive = false;
if (stateFilter != null) {
switch (stateFilter) {
case DECOMMISSIONED:
case LOST:
case REBOOTED:
case SHUTDOWN:
rmNodes = this.rm.getRMContext().getInactiveRMNodes().values();
isInactive = true;
break;
case DECOMMISSIONING:
// Do nothing
break;
default:
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();
if (!stateFilter.equals(state)) {
continue;
}
} else {
// No filter. User is asking for all nodes. Make sure you skip the
// unhealthy nodes.
if (ni.getState() == NodeState.UNHEALTHY) {
continue;
}
}
// Besides state, we need to filter label as well.
if (!labelFilter.equals(RMNodeLabelsManager.ANY)) {
if (labelFilter.isEmpty()) {
// Empty label filter means only shows nodes without label
if (!ni.getNodeLabels().isEmpty()) {
continue;
}
} else if (!ni.getNodeLabels().contains(labelFilter)) {
// Only nodes have given label can show on web page.
continue;
}
}
NodeInfo info = new NodeInfo(ni, sched);
int usedMemory = (int) info.getUsedMemory();
int availableMemory = (int) info.getAvailableMemory();
long totalMemory = info.getTotalResource().getMemorySize();
int totalVcore = info.getTotalResource().getvCores();
nodeTableData.append("[\"")
.append(StringUtils.join(",", info.getNodeLabels())).append("\",\"")
.append(info.getRack()).append("\",\"").append(info.getState())
.append("\",\"").append(info.getNodeId());
if (isInactive) {
nodeTableData.append("\",\"").append("N/A").append("\",\"");
} else {
String httpAddress = info.getNodeHTTPAddress();
nodeTableData.append("\",\"<a ").append("href='" + "//" + httpAddress)
.append("'>").append(httpAddress).append("</a>\",").append("\"");
}
nodeTableData.append("<br title='")
.append(String.valueOf(info.getLastHealthUpdate())).append("'>")
.append(Times.format(info.getLastHealthUpdate())).append("\",\"")
.append(StringEscapeUtils.escapeJava(info.getHealthReport())).append("\",\"")
.append(String.valueOf(info.getNumContainers())).append("\",\"")
.append(info.getAllocationTagsSummary()).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("<br title='").append(String.valueOf(totalMemory))
.append("'>").append(StringUtils.byteDesc(totalMemory * BYTES_IN_MB))
.append("\",\"")
.append(String.valueOf((int) info.getMemUtilization()))
.append("\",\"")
.append(String.valueOf(info.getUsedVirtualCores()))
.append("\",\"")
.append(String.valueOf(info.getAvailableVirtualCores()))
.append("\",\"")
.append(String.valueOf(totalVcore))
.append("\",\"")
.append(String.valueOf((int) info.getVcoreUtilization()))
.append("\",\"");
// If opportunistic containers are enabled, add extra fields.
if (this.opportunisticContainersEnabled) {
nodeTableData
.append(String.valueOf(info.getNumRunningOpportContainers()))
.append("\",\"").append("<br title='")
.append(String.valueOf(info.getUsedMemoryOpportGB())).append("'>")
.append(StringUtils.byteDesc(
info.getUsedMemoryOpportGB() * BYTES_IN_GB))
.append("\",\"")
.append(String.valueOf(info.getUsedVirtualCoresOpport()))
.append("\",\"")
.append(String.valueOf(info.getNumQueuedContainers()))
.append("\",\"");
}
for (Map.Entry<String, Integer> integerEntry :
ResourceUtils.getResourceTypeIndex().entrySet()) {
if (integerEntry.getKey().equals(ResourceInformation.MEMORY_URI)
|| integerEntry.getKey().equals(ResourceInformation.VCORES_URI)) {
continue;
}
long usedCustomResource = 0;
long availableCustomResource = 0;
String resourceName = integerEntry.getKey();
Integer index = integerEntry.getValue();
if (index != null && info.getUsedResource() != null
&& info.getAvailableResource() != null) {
usedCustomResource = info.getUsedResource().getResource()
.getResourceValue(resourceName);
availableCustomResource = info.getAvailableResource().getResource()
.getResourceValue(resourceName);
nodeTableData
.append(usedCustomResource)
.append("\",\"")
.append(availableCustomResource)
.append("\",\"");
}
}
nodeTableData.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.__().__();
}