From 02f72d7a6b5804d8fa57803061233e19608883d0 Mon Sep 17 00:00:00 2001 From: Karthik Kambatla Date: Wed, 9 Jul 2014 20:03:18 +0000 Subject: [PATCH] YARN-2131. Add a way to format the RMStateStore. (Robert Kanter via kasha) git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1609280 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-yarn-project/CHANGES.txt | 2 + hadoop-yarn-project/hadoop-yarn/bin/yarn | 29 +++++----- .../resourcemanager/ResourceManager.java | 36 ++++++++++-- .../recovery/FileSystemRMStateStore.java | 7 +++ .../recovery/MemoryRMStateStore.java | 4 ++ .../recovery/NullRMStateStore.java | 5 ++ .../recovery/RMStateStore.java | 6 ++ .../recovery/ZKRMStateStore.java | 30 ++++++++++ .../recovery/RMStateStoreTestBase.java | 56 ++++++++++++------- .../recovery/TestFSRMStateStore.java | 1 + .../recovery/TestZKRMStateStore.java | 1 + .../src/site/apt/YarnCommands.apt.vm | 10 +++- 12 files changed, 146 insertions(+), 41 deletions(-) diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index e0f3ebd9bf0..21bb7d20d4f 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -6,6 +6,8 @@ Release 2.6.0 - UNRELEASED NEW FEATURES + YARN-2131. Add a way to format the RMStateStore. (Robert Kanter via kasha) + IMPROVEMENTS YARN-2242. Improve exception information on AM launch crashes. (Li Lu diff --git a/hadoop-yarn-project/hadoop-yarn/bin/yarn b/hadoop-yarn-project/hadoop-yarn/bin/yarn index c84aa34e4da..f52a83e609e 100644 --- a/hadoop-yarn-project/hadoop-yarn/bin/yarn +++ b/hadoop-yarn-project/hadoop-yarn/bin/yarn @@ -61,20 +61,21 @@ HADOOP_LIBEXEC_DIR=${HADOOP_LIBEXEC_DIR:-$DEFAULT_LIBEXEC_DIR} function print_usage(){ echo "Usage: yarn [--config confdir] COMMAND" echo "where COMMAND is one of:" - echo " resourcemanager run the ResourceManager" - echo " nodemanager run a nodemanager on each slave" - echo " timelineserver run the timeline server" - echo " rmadmin admin tools" - echo " version print the version" - echo " jar run a jar file" - echo " application prints application(s) report/kill application" - echo " applicationattempt prints applicationattempt(s) report" - echo " container prints container(s) report" - echo " node prints node report(s)" - echo " logs dump container logs" - echo " classpath prints the class path needed to get the" - echo " Hadoop jar and the required libraries" - echo " daemonlog get/set the log level for each daemon" + echo " resourcemanager -format deletes the RMStateStore" + echo " resourcemanager run the ResourceManager" + echo " nodemanager run a nodemanager on each slave" + echo " timelineserver run the timeline server" + echo " rmadmin admin tools" + echo " version print the version" + echo " jar run a jar file" + echo " application prints application(s) report/kill application" + echo " applicationattempt prints applicationattempt(s) report" + echo " container prints container(s) report" + echo " node prints node report(s)" + echo " logs dump container logs" + echo " classpath prints the class path needed to get the" + echo " Hadoop jar and the required libraries" + echo " daemonlog get/set the log level for each daemon" echo " or" echo " CLASSNAME run the class named CLASSNAME" echo "Most commands print help when invoked w/o parameters." diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java index c921ae9f2c9..e2deaa11c60 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java @@ -1035,12 +1035,17 @@ public class ResourceManager extends CompositeService implements Recoverable { StringUtils.startupShutdownMessage(ResourceManager.class, argv, LOG); try { Configuration conf = new YarnConfiguration(); - ResourceManager resourceManager = new ResourceManager(); - ShutdownHookManager.get().addShutdownHook( - new CompositeServiceShutdownHook(resourceManager), - SHUTDOWN_HOOK_PRIORITY); - resourceManager.init(conf); - resourceManager.start(); + // If -format, then delete RMStateStore; else startup normally + if (argv.length == 1 && argv[0].equals("-format")) { + deleteRMStateStore(conf); + } else { + ResourceManager resourceManager = new ResourceManager(); + ShutdownHookManager.get().addShutdownHook( + new CompositeServiceShutdownHook(resourceManager), + SHUTDOWN_HOOK_PRIORITY); + resourceManager.init(conf); + resourceManager.start(); + } } catch (Throwable t) { LOG.fatal("Error starting ResourceManager", t); System.exit(-1); @@ -1077,4 +1082,23 @@ public class ResourceManager extends CompositeService implements Recoverable { return conf.getSocketAddr(YarnConfiguration.RM_ADDRESS, YarnConfiguration.DEFAULT_RM_ADDRESS, YarnConfiguration.DEFAULT_RM_PORT); } + + /** + * Deletes the RMStateStore + * + * @param conf + * @throws Exception + */ + private static void deleteRMStateStore(Configuration conf) throws Exception { + RMStateStore rmStore = RMStateStoreFactory.getStore(conf); + rmStore.init(conf); + rmStore.start(); + try { + LOG.info("Deleting ResourceManager state store..."); + rmStore.deleteStore(); + LOG.info("State store deleted"); + } finally { + rmStore.stop(); + } + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/FileSystemRMStateStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/FileSystemRMStateStore.java index b315a84859a..0e605a9b07d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/FileSystemRMStateStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/FileSystemRMStateStore.java @@ -515,6 +515,13 @@ public class FileSystemRMStateStore extends RMStateStore { deleteFile(nodeCreatePath); } + @Override + public synchronized void deleteStore() throws IOException { + if (fs.exists(rootDirPath)) { + fs.delete(rootDirPath, true); + } + } + private Path getAppDir(Path root, String appId) { return getNodePath(root, appId); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MemoryRMStateStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MemoryRMStateStore.java index 6b5b602381c..05cbb09630f 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MemoryRMStateStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MemoryRMStateStore.java @@ -267,4 +267,8 @@ public class MemoryRMStateStore extends RMStateStore { return null; } + @Override + public void deleteStore() throws Exception { + } + } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/NullRMStateStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/NullRMStateStore.java index 603d020f55c..690f0bef94d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/NullRMStateStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/NullRMStateStore.java @@ -138,4 +138,9 @@ public class NullRMStateStore extends RMStateStore { return null; } + @Override + public void deleteStore() throws Exception { + // Do nothing + } + } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java index 9b05ea1fdcc..5b75b429697 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java @@ -845,4 +845,10 @@ public abstract class RMStateStore extends AbstractService { handleStoreEvent(event); } } + + /** + * Derived classes must implement this method to delete the state store + * @throws Exception + */ + public abstract void deleteStore() throws Exception; } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/ZKRMStateStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/ZKRMStateStore.java index 6dd4574b42e..68b4632d3b5 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/ZKRMStateStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/ZKRMStateStore.java @@ -805,6 +805,13 @@ public class ZKRMStateStore extends RMStateStore { } } + @Override + public synchronized void deleteStore() throws Exception { + if (existsWithRetries(zkRootNodePath, true) != null) { + deleteWithRetries(zkRootNodePath, true); + } + } + // ZK related code /** * Watcher implementation which forward events to the ZKRMStateStore This @@ -959,6 +966,29 @@ public class ZKRMStateStore extends RMStateStore { }.runWithRetries(); } + private void deleteWithRetries( + final String path, final boolean watch) throws Exception { + new ZKAction() { + @Override + Void run() throws KeeperException, InterruptedException { + recursiveDeleteWithRetriesHelper(path, watch); + return null; + } + }.runWithRetries(); + } + + /** + * Helper method that deletes znodes recursively + */ + private void recursiveDeleteWithRetriesHelper(String path, boolean watch) + throws KeeperException, InterruptedException { + List children = zkClient.getChildren(path, watch); + for (String child : children) { + recursiveDeleteWithRetriesHelper(path + "/" + child, false); + } + zkClient.delete(path, -1); + } + /** * Helper class that periodically attempts creating a znode to ensure that * this RM continues to be the Active. diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreTestBase.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreTestBase.java index 49d71355908..6ac23a2ad57 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreTestBase.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreTestBase.java @@ -515,26 +515,7 @@ public class RMStateStoreTestBase extends ClientBaseWithFixes{ throws Exception { RMStateStore store = stateStoreHelper.getRMStateStore(); store.setRMDispatcher(new TestDispatcher()); - // create and store apps - ArrayList appList = new ArrayList(); - int NUM_APPS = 5; - for (int i = 0; i < NUM_APPS; i++) { - ApplicationId appId = ApplicationId.newInstance(1383183338, i); - RMApp app = storeApp(store, appId, 123456789, 987654321); - appList.add(app); - } - - Assert.assertEquals(NUM_APPS, appList.size()); - for (RMApp app : appList) { - // wait for app to be stored. - while (true) { - if (stateStoreHelper.appExists(app)) { - break; - } else { - Thread.sleep(100); - } - } - } + ArrayList appList = createAndStoreApps(stateStoreHelper, store, 5); for (RMApp app : appList) { // remove the app @@ -550,6 +531,41 @@ public class RMStateStoreTestBase extends ClientBaseWithFixes{ } } + private ArrayList createAndStoreApps( + RMStateStoreHelper stateStoreHelper, RMStateStore store, int numApps) + throws Exception { + ArrayList appList = new ArrayList(); + for (int i = 0; i < numApps; i++) { + ApplicationId appId = ApplicationId.newInstance(1383183338, i); + RMApp app = storeApp(store, appId, 123456789, 987654321); + appList.add(app); + } + + Assert.assertEquals(numApps, appList.size()); + for (RMApp app : appList) { + // wait for app to be stored. + while (true) { + if (stateStoreHelper.appExists(app)) { + break; + } else { + Thread.sleep(100); + } + } + } + return appList; + } + + public void testDeleteStore(RMStateStoreHelper stateStoreHelper) + throws Exception { + RMStateStore store = stateStoreHelper.getRMStateStore(); + ArrayList appList = createAndStoreApps(stateStoreHelper, store, 5); + store.deleteStore(); + // verify apps deleted + for (RMApp app : appList) { + Assert.assertFalse(stateStoreHelper.appExists(app)); + } + } + protected void modifyAppState() throws Exception { } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/TestFSRMStateStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/TestFSRMStateStore.java index 6ccaeaeaf57..ea90c3d76f3 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/TestFSRMStateStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/TestFSRMStateStore.java @@ -160,6 +160,7 @@ public class TestFSRMStateStore extends RMStateStoreTestBase { testCheckVersion(fsTester); testEpoch(fsTester); testAppDeletion(fsTester); + testDeleteStore(fsTester); } finally { cluster.shutdown(); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/TestZKRMStateStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/TestZKRMStateStore.java index d3a5475ab3c..e56f7757967 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/TestZKRMStateStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/TestZKRMStateStore.java @@ -122,6 +122,7 @@ public class TestZKRMStateStore extends RMStateStoreTestBase { testCheckVersion(zkTester); testEpoch(zkTester); testAppDeletion(zkTester); + testDeleteStore(zkTester); } private Configuration createHARMConf( diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/apt/YarnCommands.apt.vm b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/apt/YarnCommands.apt.vm index 018949e717a..4f3825b9d59 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/apt/YarnCommands.apt.vm +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/apt/YarnCommands.apt.vm @@ -157,9 +157,17 @@ Usage: yarn [--config confdir] COMMAND Start the ResourceManager ------- - Usage: yarn resourcemanager + Usage: yarn resourcemanager [-format] ------- +*---------------+--------------+ +|| COMMAND_OPTIONS || Description | +*---------------+--------------+ +| -format | Formats the RMStateStore. This will clear the RMStateStore and is +| | useful if past applications are no longer needed. This should be run +| | only when the ResourceManager is not running. +*---------------+--------------+ + ** nodemanager Start the NodeManager