diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/ContainersMonitorImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/ContainersMonitorImpl.java index 4863ee2..540e8eb 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/ContainersMonitorImpl.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/monitor/ContainersMonitorImpl.java @@ -20,6 +20,9 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; +import org.apache.hadoop.yarn.exceptions.YarnException; +import org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor; +import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.ResourceHandlerModule; import org.apache.hadoop.yarn.server.nodemanager.metrics.NodeManagerMetrics; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -184,6 +187,7 @@ protected void serviceInit(Configuration myConf) throws Exception { initializeOverAllocation(conf); if (context.isOverAllocationEnabled()) { + checkOverAllocationPrerequisites(); pmemCheckEnabled = true; LOG.info("Force enabling physical memory checks because " + "overallocation is enabled"); @@ -223,6 +227,29 @@ protected void serviceInit(Configuration myConf) throws Exception { super.serviceInit(this.conf); } + /** + * Check all prerequisites for NM over-allocation. + */ + private void checkOverAllocationPrerequisites() throws YarnException { + // LinuxContainerExecutor is required to enable overallocation + if (!(containerExecutor instanceof LinuxContainerExecutor)) { + throw new YarnException(LinuxContainerExecutor.class.getName() + + " is required for overallocation"); + } + if (ResourceHandlerModule.getCGroupsHandler() == null) { + throw new YarnException("CGroups must be enabled to support" + + " overallocation"); + } + if (ResourceHandlerModule.getCpuResourceHandler() == null) { + throw new YarnException( + "CGroups cpu isolation must be enabled to support overallocation"); + } + if (ResourceHandlerModule.getMemoryResourceHandler() == null) { + throw new YarnException( + "CGroups memory isolation must be enabled for overallocation"); + } + } + private boolean isContainerMonitorEnabled() { return conf.getBoolean(YarnConfiguration.NM_CONTAINER_MONITOR_ENABLED, YarnConfiguration.DEFAULT_NM_CONTAINER_MONITOR_ENABLED);