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 4799137..aaa27c9 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 @@ -698,6 +698,9 @@ public static boolean isAclEnabled(Configuration conf) { public static final String LEVELDB_CONFIGURATION_STORE = "leveldb"; @Private @Unstable + public static final String HDFS_CONFIGURATION_STORE = "hdfs"; + @Private + @Unstable public static final String ZK_CONFIGURATION_STORE = "zk"; @Private @Unstable 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/capacity/conf/MutableCSConfigurationProvider.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/conf/MutableCSConfigurationProvider.java index 40a19a4..17e70ca 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/conf/MutableCSConfigurationProvider.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/conf/MutableCSConfigurationProvider.java @@ -77,6 +77,9 @@ public void init(Configuration config) throws IOException { case YarnConfiguration.ZK_CONFIGURATION_STORE: this.confStore = new ZKConfigurationStore(); break; + case YarnConfiguration.HDFS_CONFIGURATION_STORE: + this.confStore = new HDFSSchedulerConfigurationStore(); + break; default: this.confStore = YarnConfigurationStoreFactory.getStore(config); break; 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/capacity/conf/YarnConfigurationStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/conf/YarnConfigurationStore.java index 7fb52fc..ef0a44b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/conf/YarnConfigurationStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/conf/YarnConfigurationStore.java @@ -123,7 +123,7 @@ public void close() throws IOException {} * Retrieve the persisted configuration. * @return configuration as key-value */ - public abstract Configuration retrieve(); + public abstract Configuration retrieve() throws IOException; /** * Get a list of confirmed configuration mutations starting from a given id. diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/conf/TestMutableCSConfigurationProvider.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/conf/TestMutableCSConfigurationProvider.java index 5d43ebb..9300820 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/conf/TestMutableCSConfigurationProvider.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/conf/TestMutableCSConfigurationProvider.java @@ -18,7 +18,11 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.conf; +import org.apache.commons.io.FileUtils; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FSDataOutputStream; +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.server.resourcemanager.AdminService; @@ -30,11 +34,16 @@ import org.junit.Before; import org.junit.Test; +import java.io.File; +import java.io.IOException; import java.util.HashMap; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -99,4 +108,54 @@ public void testInMemoryBackedProvider() throws Exception { assertNull(confProvider.loadConfiguration(conf).get( "yarn.scheduler.capacity.root.a.badKey")); } + + @Test + public void testHDFSBackedProvider() throws Exception { + File testSchedulerConfigurationDir = new File( + TestMutableCSConfigurationProvider.class.getResource("").getPath() + + TestMutableCSConfigurationProvider.class.getSimpleName()); + FileUtils.deleteDirectory(testSchedulerConfigurationDir); + testSchedulerConfigurationDir.mkdirs(); + + Configuration conf = new Configuration(false); + conf.set(YarnConfiguration.SCHEDULER_CONFIGURATION_STORE_CLASS, + YarnConfiguration.HDFS_CONFIGURATION_STORE); + conf.set(HDFSSchedulerConfigurationStore.SCHEDULER_CONFIGURATION_HFDS_PATH, + testSchedulerConfigurationDir.getAbsolutePath()); + writeConf(conf, testSchedulerConfigurationDir.getAbsolutePath()); + + confProvider.init(conf); + assertNull(confProvider.loadConfiguration(conf) + .get("yarn.scheduler.capacity.root.a.goodKey")); + + doNothing().when(cs).reinitialize(any(Configuration.class), + any(RMContext.class)); + + confProvider.logAndApplyMutation(TEST_USER, goodUpdate); + assertEquals("goodVal", confProvider.loadConfiguration(conf) + .get("yarn.scheduler.capacity.root.a.goodKey")); + + assertNull(confProvider.loadConfiguration(conf) + .get("yarn.scheduler.capacity.root.a.badKey")); + doThrow(new IOException()).when(cs).reinitialize(any(Configuration.class), + any(RMContext.class)); + try { + confProvider.logAndApplyMutation(TEST_USER, badUpdate); + } catch (IOException e) { + // Expected exception. + } + assertNull(confProvider.loadConfiguration(conf) + .get("yarn.scheduler.capacity.root.a.badKey")); + + } + + private void writeConf(Configuration conf, String storePath) throws IOException { + FileSystem fileSystem = FileSystem.get(new Configuration(conf)); + String schedulerConfigurationFile = YarnConfiguration.CS_CONFIGURATION_FILE + + "." + System.currentTimeMillis(); + FSDataOutputStream outputStream = fileSystem.create( + new Path(storePath, schedulerConfigurationFile)); + conf.writeXml(outputStream); + outputStream.close(); + } }