|
@@ -52,6 +52,7 @@ import org.apache.hadoop.yarn.api.records.NodeId;
|
|
import org.apache.hadoop.yarn.api.records.NodeLabel;
|
|
import org.apache.hadoop.yarn.api.records.NodeLabel;
|
|
import org.apache.hadoop.yarn.api.records.Resource;
|
|
import org.apache.hadoop.yarn.api.records.Resource;
|
|
import org.apache.hadoop.yarn.api.records.ResourceUtilization;
|
|
import org.apache.hadoop.yarn.api.records.ResourceUtilization;
|
|
|
|
+import org.apache.hadoop.yarn.api.records.NodeAttribute;
|
|
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
|
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
|
import org.apache.hadoop.yarn.event.Dispatcher;
|
|
import org.apache.hadoop.yarn.event.Dispatcher;
|
|
import org.apache.hadoop.yarn.exceptions.YarnException;
|
|
import org.apache.hadoop.yarn.exceptions.YarnException;
|
|
@@ -85,6 +86,7 @@ import org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.Contai
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.resourceplugin.ResourcePlugin;
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.resourceplugin.ResourcePlugin;
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.resourceplugin.ResourcePluginManager;
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.resourceplugin.ResourcePluginManager;
|
|
import org.apache.hadoop.yarn.server.nodemanager.metrics.NodeManagerMetrics;
|
|
import org.apache.hadoop.yarn.server.nodemanager.metrics.NodeManagerMetrics;
|
|
|
|
+import org.apache.hadoop.yarn.server.nodemanager.nodelabels.NodeAttributesProvider;
|
|
import org.apache.hadoop.yarn.server.nodemanager.nodelabels.NodeLabelsProvider;
|
|
import org.apache.hadoop.yarn.server.nodemanager.nodelabels.NodeLabelsProvider;
|
|
import org.apache.hadoop.yarn.server.nodemanager.timelineservice.NMTimelinePublisher;
|
|
import org.apache.hadoop.yarn.server.nodemanager.timelineservice.NMTimelinePublisher;
|
|
import org.apache.hadoop.yarn.server.nodemanager.util.NodeManagerHardwareUtils;
|
|
import org.apache.hadoop.yarn.server.nodemanager.util.NodeManagerHardwareUtils;
|
|
@@ -152,21 +154,16 @@ public class NodeStatusUpdaterImpl extends AbstractService implements
|
|
Set<ContainerId> pendingContainersToRemove = new HashSet<ContainerId>();
|
|
Set<ContainerId> pendingContainersToRemove = new HashSet<ContainerId>();
|
|
|
|
|
|
private NMNodeLabelsHandler nodeLabelsHandler;
|
|
private NMNodeLabelsHandler nodeLabelsHandler;
|
|
- private final NodeLabelsProvider nodeLabelsProvider;
|
|
|
|
|
|
+ private NMNodeAttributesHandler nodeAttributesHandler;
|
|
|
|
+ private NodeLabelsProvider nodeLabelsProvider;
|
|
|
|
+ private NodeAttributesProvider nodeAttributesProvider;
|
|
|
|
|
|
public NodeStatusUpdaterImpl(Context context, Dispatcher dispatcher,
|
|
public NodeStatusUpdaterImpl(Context context, Dispatcher dispatcher,
|
|
NodeHealthCheckerService healthChecker, NodeManagerMetrics metrics) {
|
|
NodeHealthCheckerService healthChecker, NodeManagerMetrics metrics) {
|
|
- this(context, dispatcher, healthChecker, metrics, null);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public NodeStatusUpdaterImpl(Context context, Dispatcher dispatcher,
|
|
|
|
- NodeHealthCheckerService healthChecker, NodeManagerMetrics metrics,
|
|
|
|
- NodeLabelsProvider nodeLabelsProvider) {
|
|
|
|
super(NodeStatusUpdaterImpl.class.getName());
|
|
super(NodeStatusUpdaterImpl.class.getName());
|
|
this.healthChecker = healthChecker;
|
|
this.healthChecker = healthChecker;
|
|
this.context = context;
|
|
this.context = context;
|
|
this.dispatcher = dispatcher;
|
|
this.dispatcher = dispatcher;
|
|
- this.nodeLabelsProvider = nodeLabelsProvider;
|
|
|
|
this.metrics = metrics;
|
|
this.metrics = metrics;
|
|
this.recentlyStoppedContainers = new LinkedHashMap<ContainerId, Long>();
|
|
this.recentlyStoppedContainers = new LinkedHashMap<ContainerId, Long>();
|
|
this.pendingCompletedContainers =
|
|
this.pendingCompletedContainers =
|
|
@@ -175,6 +172,16 @@ public class NodeStatusUpdaterImpl extends AbstractService implements
|
|
new ArrayList<LogAggregationReport>();
|
|
new ArrayList<LogAggregationReport>();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public void setNodeAttributesProvider(NodeAttributesProvider provider) {
|
|
|
|
+ this.nodeAttributesProvider = provider;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void setNodeLabelsProvider(NodeLabelsProvider provider) {
|
|
|
|
+ this.nodeLabelsProvider = provider;
|
|
|
|
+ }
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
protected void serviceInit(Configuration conf) throws Exception {
|
|
protected void serviceInit(Configuration conf) throws Exception {
|
|
this.totalResource = NodeManagerHardwareUtils.getNodeResources(conf);
|
|
this.totalResource = NodeManagerHardwareUtils.getNodeResources(conf);
|
|
@@ -214,7 +221,11 @@ public class NodeStatusUpdaterImpl extends AbstractService implements
|
|
YarnConfiguration.NM_RESOURCEMANAGER_MINIMUM_VERSION,
|
|
YarnConfiguration.NM_RESOURCEMANAGER_MINIMUM_VERSION,
|
|
YarnConfiguration.DEFAULT_NM_RESOURCEMANAGER_MINIMUM_VERSION);
|
|
YarnConfiguration.DEFAULT_NM_RESOURCEMANAGER_MINIMUM_VERSION);
|
|
|
|
|
|
- nodeLabelsHandler = createNMNodeLabelsHandler(nodeLabelsProvider);
|
|
|
|
|
|
+ nodeLabelsHandler =
|
|
|
|
+ createNMNodeLabelsHandler(nodeLabelsProvider);
|
|
|
|
+ nodeAttributesHandler =
|
|
|
|
+ createNMNodeAttributesHandler(nodeAttributesProvider);
|
|
|
|
+
|
|
// Default duration to track stopped containers on nodemanager is 10Min.
|
|
// Default duration to track stopped containers on nodemanager is 10Min.
|
|
// This should not be assigned very large value as it will remember all the
|
|
// This should not be assigned very large value as it will remember all the
|
|
// containers stopped during that time.
|
|
// containers stopped during that time.
|
|
@@ -856,6 +867,43 @@ public class NodeStatusUpdaterImpl extends AbstractService implements
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Returns a handler based on the configured node attributes provider.
|
|
|
|
+ * returns null if no provider is configured.
|
|
|
|
+ * @param provider
|
|
|
|
+ * @return attributes handler
|
|
|
|
+ */
|
|
|
|
+ private NMNodeAttributesHandler createNMNodeAttributesHandler(
|
|
|
|
+ NodeAttributesProvider provider) {
|
|
|
|
+ return provider == null ? null :
|
|
|
|
+ new NMDistributedNodeAttributesHandler(nodeAttributesProvider);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private interface NMNodeAttributesHandler {
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @return the node attributes of this node manager.
|
|
|
|
+ */
|
|
|
|
+ Set<NodeAttribute> getNodeAttributesForHeartbeat();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private static class NMDistributedNodeAttributesHandler
|
|
|
|
+ implements NMNodeAttributesHandler {
|
|
|
|
+
|
|
|
|
+ private final NodeAttributesProvider attributesProvider;
|
|
|
|
+
|
|
|
|
+ protected NMDistributedNodeAttributesHandler(
|
|
|
|
+ NodeAttributesProvider provider) {
|
|
|
|
+ this.attributesProvider = provider;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public Set<NodeAttribute> getNodeAttributesForHeartbeat() {
|
|
|
|
+ return attributesProvider.getDescriptors();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
private static interface NMNodeLabelsHandler {
|
|
private static interface NMNodeLabelsHandler {
|
|
/**
|
|
/**
|
|
* validates nodeLabels From Provider and returns it to the caller. Also
|
|
* validates nodeLabels From Provider and returns it to the caller. Also
|
|
@@ -1071,6 +1119,9 @@ public class NodeStatusUpdaterImpl extends AbstractService implements
|
|
NodeHeartbeatResponse response = null;
|
|
NodeHeartbeatResponse response = null;
|
|
Set<NodeLabel> nodeLabelsForHeartbeat =
|
|
Set<NodeLabel> nodeLabelsForHeartbeat =
|
|
nodeLabelsHandler.getNodeLabelsForHeartbeat();
|
|
nodeLabelsHandler.getNodeLabelsForHeartbeat();
|
|
|
|
+ Set<NodeAttribute> nodeAttributesForHeartbeat =
|
|
|
|
+ nodeAttributesHandler == null ? null :
|
|
|
|
+ nodeAttributesHandler.getNodeAttributesForHeartbeat();
|
|
NodeStatus nodeStatus = getNodeStatus(lastHeartbeatID);
|
|
NodeStatus nodeStatus = getNodeStatus(lastHeartbeatID);
|
|
NodeHeartbeatRequest request =
|
|
NodeHeartbeatRequest request =
|
|
NodeHeartbeatRequest.newInstance(nodeStatus,
|
|
NodeHeartbeatRequest.newInstance(nodeStatus,
|
|
@@ -1079,6 +1130,7 @@ public class NodeStatusUpdaterImpl extends AbstractService implements
|
|
NodeStatusUpdaterImpl.this.context
|
|
NodeStatusUpdaterImpl.this.context
|
|
.getNMTokenSecretManager().getCurrentKey(),
|
|
.getNMTokenSecretManager().getCurrentKey(),
|
|
nodeLabelsForHeartbeat,
|
|
nodeLabelsForHeartbeat,
|
|
|
|
+ nodeAttributesForHeartbeat,
|
|
NodeStatusUpdaterImpl.this.context
|
|
NodeStatusUpdaterImpl.this.context
|
|
.getRegisteringCollectors());
|
|
.getRegisteringCollectors());
|
|
|
|
|