diff --git hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/src/main/java/org/apache/hadoop/mapred/ShuffleHandler.java hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/src/main/java/org/apache/hadoop/mapred/ShuffleHandler.java index f9d1203..f652717 100644 --- hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/src/main/java/org/apache/hadoop/mapred/ShuffleHandler.java +++ hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/src/main/java/org/apache/hadoop/mapred/ShuffleHandler.java @@ -146,7 +146,7 @@ private ReadaheadPool readaheadPool = ReadaheadPool.getInstance(); public static final String MAPREDUCE_SHUFFLE_SERVICEID = - "mapreduce.shuffle"; + "MapreduceShuffle"; private static final Map userRsrc = new ConcurrentHashMap(); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml index 8aa7d01..57972df 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml @@ -705,9 +705,10 @@ + the valid service name should only contain a-zA-Z0-9_ and can not start with numbers yarn.nodemanager.aux-services - + @@ -763,7 +764,7 @@ - yarn.nodemanager.aux-services.mapreduce.shuffle.class + yarn.nodemanager.aux-services.MapreduceShuffle.class org.apache.hadoop.mapred.ShuffleHandler diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/AuxServices.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/AuxServices.java index 13f4365..3c6c7d7 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/AuxServices.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/AuxServices.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Map.Entry; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; @@ -40,6 +41,8 @@ import org.apache.hadoop.yarn.server.api.ContainerInitializationContext; import org.apache.hadoop.yarn.server.api.ContainerTerminationContext; +import com.google.common.base.Preconditions; + public class AuxServices extends AbstractService implements ServiceStateChangeListener, EventHandler { @@ -90,6 +93,13 @@ public void serviceInit(Configuration conf) throws Exception { YarnConfiguration.NM_AUX_SERVICES); for (final String sName : auxNames) { try { + Preconditions + .checkArgument( + validateAuxServiceName(sName), + "The ServiceName: " + sName + " set in " + + YarnConfiguration.NM_AUX_SERVICES +" is invalid." + + "The valid service name should only contain a-zA-Z0-9_ " + + "and can not start with numbers"); Class sClass = conf.getClass( String.format(YarnConfiguration.NM_AUX_SERVICE_FMT, sName), null, AuxiliaryService.class); @@ -199,4 +209,20 @@ public void handle(AuxServicesEvent event) { } } + private boolean validateAuxServiceName(String name) { + if (name == null) { + return false; + } + if(Character.isDigit(name.charAt(0))) { + return false; + } + int sz = name.length(); + for (int i = 0; i < sz; i++) { + if (Character.isLetterOrDigit(name.charAt(i)) == false + && name.charAt(i) != '_') { + return false; + } + } + return true; + } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/TestAuxServices.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/TestAuxServices.java index 81f758e..a58f3bd 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/TestAuxServices.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/TestAuxServices.java @@ -31,6 +31,8 @@ import java.util.Collection; import java.util.Map; +import junit.framework.Assert; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; @@ -288,4 +290,33 @@ public void testAuxUnexpectedStop() { assertTrue(aux.getServices().isEmpty()); } + @Test + public void testValidAuxServiceName() { + final AuxServices aux = new AuxServices(); + Configuration conf = new Configuration(); + conf.setStrings(YarnConfiguration.NM_AUX_SERVICES, new String[] {"Asrv1", "Bsrv_2"}); + conf.setClass(String.format(YarnConfiguration.NM_AUX_SERVICE_FMT, "Asrv1"), + ServiceA.class, Service.class); + conf.setClass(String.format(YarnConfiguration.NM_AUX_SERVICE_FMT, "Bsrv_2"), + ServiceB.class, Service.class); + try { + aux.init(conf); + } catch (Exception ex) { + Assert.fail("Should not receive the exception."); + } + + //Test bad auxService Name + final AuxServices aux1 = new AuxServices(); + conf.setStrings(YarnConfiguration.NM_AUX_SERVICES, new String[] {"1Asrv1"}); + conf.setClass(String.format(YarnConfiguration.NM_AUX_SERVICE_FMT, "1Asrv1"), + ServiceA.class, Service.class); + try { + aux1.init(conf); + Assert.fail("Should receive the exception."); + } catch (Exception ex) { + assertTrue(ex.getMessage().contains("The ServiceName: 1Asrv1 set in " + + "yarn.nodemanager.aux-services is invalid.The valid service name " + + "should only contain a-zA-Z0-9_ and can not start with numbers")); + } + } }