diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java index 5292a250533..b8a95ed8064 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java @@ -3698,6 +3698,11 @@ public static boolean areNodeLabelsEnabled( public static final String DEFAULT_NM_NUMA_AWARENESS_NUMACTL_CMD = "/usr/bin/numactl"; + public static final String NODE_HEARTBEAT_PLIUGIN_CLASS = + NM_PREFIX + "node-heartbeat-plugin.class"; + public static final String DEFAULT_NODE_HEARTBEAT_PLIUGIN_CLASS = + "org.apache.hadoop.yarn.server.resourcemanager.api.NodeHeartBeatPluginImpl"; + public YarnConfiguration() { super(); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/api/BaseNodeHeartBeatPluginImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/api/BaseNodeHeartBeatPluginImpl.java index e69de29bb2d..09a10c3b01c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/api/BaseNodeHeartBeatPluginImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/api/BaseNodeHeartBeatPluginImpl.java @@ -0,0 +1,48 @@ +package org.apache.hadoop.yarn.server.resourcemanager.api; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.util.ReflectionUtils; +import org.apache.hadoop.yarn.conf.YarnConfiguration; +import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNode; + +public abstract class BaseNodeHeartBeatPluginImpl + implements NodeHeartBeatPlugin { + + private static final Log LOG = + LogFactory.getLog(BaseNodeHeartBeatPluginImpl.class); + + public BaseNodeHeartBeatPluginImpl() { + + } + + @Override + public abstract void onNodeHeartBeat(SchedulerNode schedulerNode); + + public static NodeHeartBeatPlugin getNodeHeartBeatPluginImpl( + Configuration conf) { + + String nodeHeartBeatPluginClass = + conf.get(YarnConfiguration.NODE_HEARTBEAT_PLIUGIN_CLASS, + YarnConfiguration.DEFAULT_NODE_HEARTBEAT_PLIUGIN_CLASS); + LOG.info("Using Node HeartBeat plugin: " + nodeHeartBeatPluginClass); + try { + Class clazz = Class.forName(nodeHeartBeatPluginClass); + if (NodeHeartBeatPlugin.class.isAssignableFrom(clazz)) { + return (NodeHeartBeatPlugin) ReflectionUtils + .newInstance(clazz, conf); + } else { + throw new YarnRuntimeException( + "Class: " + nodeHeartBeatPluginClass + " not instance of " + + NodeHeartBeatPlugin.class.getCanonicalName()); + } + } catch (ClassNotFoundException e) { + throw new YarnRuntimeException( + "Could not instantiate Node HeartBeat plugin: " + + nodeHeartBeatPluginClass, + e); + } + } +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/api/NodeHeartBeatPlugin.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/api/NodeHeartBeatPlugin.java index e69de29bb2d..ca532039947 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/api/NodeHeartBeatPlugin.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/api/NodeHeartBeatPlugin.java @@ -0,0 +1,7 @@ +package org.apache.hadoop.yarn.server.resourcemanager.api; + +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNode; + +public interface NodeHeartBeatPlugin { + void onNodeHeartBeat(SchedulerNode schedulerNode); +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/api/NodeHeartBeatPluginImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/api/NodeHeartBeatPluginImpl.java index e69de29bb2d..c4697fd008c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/api/NodeHeartBeatPluginImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/api/NodeHeartBeatPluginImpl.java @@ -0,0 +1,22 @@ +package org.apache.hadoop.yarn.server.resourcemanager.api; + +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNode; + +public class NodeHeartBeatPluginImpl extends BaseNodeHeartBeatPluginImpl { + + public NodeHeartBeatPluginImpl() { + } + + @Override + public void onNodeHeartBeat(SchedulerNode schedulerNode) { + updateUnallocatedResource(schedulerNode); + } + + private void updateUnallocatedResource(SchedulerNode schedulerNode) { + + // calculate UnallocatedResource based on different properties (for + // example, isSchedulerExternal()) and update. + // schedulerNode may need to expose corresponding setter method to set + // the value + } +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AbstractYarnScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AbstractYarnScheduler.java index d2e81a50d94..517cd5e273f 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AbstractYarnScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AbstractYarnScheduler.java @@ -69,6 +69,8 @@ import org.apache.hadoop.yarn.server.resourcemanager.RMCriticalThreadUncaughtExceptionHandler; import org.apache.hadoop.yarn.server.resourcemanager.RMServerUtils; import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager; +import org.apache.hadoop.yarn.server.resourcemanager.api.BaseNodeHeartBeatPluginImpl; +import org.apache.hadoop.yarn.server.resourcemanager.api.NodeHeartBeatPlugin; import org.apache.hadoop.yarn.server.resourcemanager.monitor.SchedulingMonitorManager; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppEvent; @@ -1139,6 +1141,15 @@ protected void nodeUpdate(RMNode nm) { updateNodeResourceUtilization(nm, schedulerNode); } + NodeHeartBeatPlugin nodeHeartBeatPlugin = + BaseNodeHeartBeatPluginImpl + .getNodeHeartBeatPluginImpl(this.getConfig()); + if (nodeHeartBeatPlugin != null) { + nodeHeartBeatPlugin.onNodeHeartBeat(schedulerNode); + } else { + // log error + } + // Now node data structures are up-to-date and ready for scheduling. if(LOG.isDebugEnabled()) { LOG.debug(