// There are two scenarios when RM failover happens
        // during SubmitApplication Call:
        // 1) RMStateStore already saved the ApplicationState when failover happens
        // 2) RMStateStore did not save the ApplicationState when failover happens
        /// <exception cref="System.Exception"/>
        public virtual void TestHandleRMHADuringSubmitApplicationCallWithSavedApplicationState
            ()
        {
            // Test scenario 1 when RM failover happens
            // druing SubmitApplication Call:
            // RMStateStore already saved the ApplicationState when failover happens
            StartRMs();
            // Submit Application
            // After submission, the applicationState will be saved in RMStateStore.
            RMApp app0 = rm1.SubmitApp(200);

            // Do the failover
            ExplicitFailover();
            // Since the applicationState has already been saved in RMStateStore
            // before failover happens, the current active rm can load the previous
            // applicationState.
            // This RMApp should exist in the RMContext of current active RM
            NUnit.Framework.Assert.IsTrue(rm2.GetRMContext().GetRMApps().Contains(app0.GetApplicationId
                                                                                      ()));
            // When we re-submit the application with same applicationId, it will
            // check whether this application has been exist. If yes, just simply
            // return submitApplicationResponse.
            RMApp app1 = rm2.SubmitApp(200, string.Empty, UserGroupInformation.GetCurrentUser
                                           ().GetShortUserName(), null, false, null, configuration.GetInt(YarnConfiguration
                                                                                                          .RmAmMaxAttempts, YarnConfiguration.DefaultRmAmMaxAttempts), null, null, false,
                                       false, true, app0.GetApplicationId());

            NUnit.Framework.Assert.AreEqual(app1.GetApplicationId(), app0.GetApplicationId());
        }
        /// <exception cref="System.Exception"/>
        public virtual void TestAppCleanupWhenNMReconnects()
        {
            conf.SetInt(YarnConfiguration.RmAmMaxAttempts, 1);
            MemoryRMStateStore memStore = new MemoryRMStateStore();

            memStore.Init(conf);
            // start RM
            MockRM rm1 = new MockRM(conf, memStore);

            rm1.Start();
            MockNM nm1 = new MockNM("127.0.0.1:1234", 15120, rm1.GetResourceTrackerService());

            nm1.RegisterNode();
            // create app and launch the AM
            RMApp  app0 = rm1.SubmitApp(200);
            MockAM am0  = LaunchAM(app0, rm1, nm1);

            nm1.NodeHeartbeat(am0.GetApplicationAttemptId(), 1, ContainerState.Complete);
            rm1.WaitForState(app0.GetApplicationId(), RMAppState.Failed);
            // wait for application cleanup message received
            WaitForAppCleanupMessageRecved(nm1, app0.GetApplicationId());
            // reconnect NM with application still active
            nm1.RegisterNode(Arrays.AsList(app0.GetApplicationId()));
            WaitForAppCleanupMessageRecved(nm1, app0.GetApplicationId());
            rm1.Stop();
        }
Beispiel #3
0
        // Test regular RM restart/failover, new RM should not count
        // AM failure towards the max-retry-account and should be able to
        // re-launch the AM.
        /// <exception cref="System.Exception"/>
        public virtual void TestRMRestartOrFailoverNotCountedForAMFailures()
        {
            YarnConfiguration conf = new YarnConfiguration();

            conf.SetClass(YarnConfiguration.RmScheduler, typeof(CapacityScheduler), typeof(ResourceScheduler
                                                                                           ));
            conf.SetBoolean(YarnConfiguration.RecoveryEnabled, true);
            conf.SetBoolean(YarnConfiguration.RmWorkPreservingRecoveryEnabled, false);
            conf.Set(YarnConfiguration.RmStore, typeof(MemoryRMStateStore).FullName);
            // explicitly set max-am-retry count as 1.
            conf.SetInt(YarnConfiguration.RmAmMaxAttempts, 1);
            MemoryRMStateStore memStore = new MemoryRMStateStore();

            memStore.Init(conf);
            MockRM rm1 = new MockRM(conf, memStore);

            rm1.Start();
            MockNM nm1 = new MockNM("127.0.0.1:1234", 8000, rm1.GetResourceTrackerService());

            nm1.RegisterNode();
            RMApp app1 = rm1.SubmitApp(200);
            // AM should be restarted even though max-am-attempt is 1.
            MockAM       am1      = MockRM.LaunchAndRegisterAM(app1, rm1, nm1);
            RMAppAttempt attempt1 = app1.GetCurrentAppAttempt();

            NUnit.Framework.Assert.IsTrue(((RMAppAttemptImpl)attempt1).MayBeLastAttempt());
            // Restart rm.
            MockRM rm2 = new MockRM(conf, memStore);

            rm2.Start();
            ApplicationStateData appState = memStore.GetState().GetApplicationState()[app1.GetApplicationId
                                                                                          ()];

            // re-register the NM
            nm1.SetResourceTrackerService(rm2.GetResourceTrackerService());
            NMContainerStatus status = Org.Apache.Hadoop.Yarn.Util.Records.NewRecord <NMContainerStatus
                                                                                      >();

            status.SetContainerExitStatus(ContainerExitStatus.KilledByResourcemanager);
            status.SetContainerId(attempt1.GetMasterContainer().GetId());
            status.SetContainerState(ContainerState.Complete);
            status.SetDiagnostics(string.Empty);
            nm1.RegisterNode(Sharpen.Collections.SingletonList(status), null);
            rm2.WaitForState(attempt1.GetAppAttemptId(), RMAppAttemptState.Failed);
            NUnit.Framework.Assert.AreEqual(ContainerExitStatus.KilledByResourcemanager, appState
                                            .GetAttempt(am1.GetApplicationAttemptId()).GetAMContainerExitStatus());
            // Will automatically start a new AppAttempt in rm2
            rm2.WaitForState(app1.GetApplicationId(), RMAppState.Accepted);
            MockAM am2 = rm2.WaitForNewAMToLaunchAndRegister(app1.GetApplicationId(), 2, nm1);

            MockRM.FinishAMAndVerifyAppState(app1, rm2, nm1, am2);
            RMAppAttempt attempt3 = rm2.GetRMContext().GetRMApps()[app1.GetApplicationId()].GetCurrentAppAttempt
                                        ();

            NUnit.Framework.Assert.IsTrue(attempt3.ShouldCountTowardsMaxAttemptRetry());
            NUnit.Framework.Assert.AreEqual(ContainerExitStatus.Invalid, appState.GetAttempt(
                                                am2.GetApplicationAttemptId()).GetAMContainerExitStatus());
            rm1.Stop();
            rm2.Stop();
        }
Beispiel #4
0
        /// <exception cref="System.Exception"/>
        public virtual void TestKillAppWhenFailoverHappensAtNewState()
        {
            // create a customized RMAppManager
            // During the process of Application submission,
            // the RMAppState will always be NEW.
            // The ApplicationState will not be saved in RMStateStore.
            StartRMsWithCustomizedRMAppManager();
            MockNM nm1 = new MockNM("127.0.0.1:1234", 15120, rm1.GetResourceTrackerService());

            nm1.RegisterNode();
            // Submit the application
            RMApp app0 = rm1.SubmitApp(200, string.Empty, UserGroupInformation.GetCurrentUser
                                           ().GetShortUserName(), null, false, null, configuration.GetInt(YarnConfiguration
                                                                                                          .RmAmMaxAttempts, YarnConfiguration.DefaultRmAmMaxAttempts), null, null, false,
                                       false);

            // failover and kill application
            // When FailOver happens, the state of this application is NEW,
            // and ApplicationState is not saved in RMStateStore. The active RM
            // can not load the ApplicationState of this application.
            // Expected to get ApplicationNotFoundException
            // when receives the KillApplicationRequest
            try
            {
                FailOverAndKillApp(app0.GetApplicationId(), RMAppState.New);
                NUnit.Framework.Assert.Fail("Should get an exception here");
            }
            catch (ApplicationNotFoundException ex)
            {
                NUnit.Framework.Assert.IsTrue(ex.Message.Contains("Trying to kill an absent application "
                                                                  + app0.GetApplicationId()));
            }
        }
        /// <exception cref="System.Exception"/>
        private void VerifySubmitApp(MockRM rm, RMApp app, ApplicationId expectedAppId)
        {
            int maxWaittingTimes = 20;
            int count            = 0;

            while (true)
            {
                YarnApplicationState state = rm.GetApplicationReport(app.GetApplicationId()).GetYarnApplicationState
                                                 ();
                if (!state.Equals(YarnApplicationState.New) && !state.Equals(YarnApplicationState
                                                                             .NewSaving))
                {
                    break;
                }
                if (count > maxWaittingTimes)
                {
                    break;
                }
                Sharpen.Thread.Sleep(200);
                count++;
            }
            // Verify submittion is successful
            YarnApplicationState state_1 = rm.GetApplicationReport(app.GetApplicationId()).GetYarnApplicationState
                                               ();

            NUnit.Framework.Assert.IsTrue(state_1 == YarnApplicationState.Accepted || state_1
                                          == YarnApplicationState.Submitted);
            NUnit.Framework.Assert.AreEqual(expectedAppId, app.GetApplicationId());
        }
Beispiel #6
0
        // Test RM restarts after AM container is preempted, new RM should not count
        // AM preemption failure towards the max-retry-account and should be able to
        // re-launch the AM.
        /// <exception cref="System.Exception"/>
        public virtual void TestPreemptedAMRestartOnRMRestart()
        {
            YarnConfiguration conf = new YarnConfiguration();

            conf.SetClass(YarnConfiguration.RmScheduler, typeof(CapacityScheduler), typeof(ResourceScheduler
                                                                                           ));
            conf.SetBoolean(YarnConfiguration.RecoveryEnabled, true);
            conf.SetBoolean(YarnConfiguration.RmWorkPreservingRecoveryEnabled, false);
            conf.Set(YarnConfiguration.RmStore, typeof(MemoryRMStateStore).FullName);
            // explicitly set max-am-retry count as 1.
            conf.SetInt(YarnConfiguration.RmAmMaxAttempts, 1);
            MemoryRMStateStore memStore = new MemoryRMStateStore();

            memStore.Init(conf);
            MockRM rm1 = new MockRM(conf, memStore);

            rm1.Start();
            MockNM nm1 = new MockNM("127.0.0.1:1234", 8000, rm1.GetResourceTrackerService());

            nm1.RegisterNode();
            RMApp             app1        = rm1.SubmitApp(200);
            RMAppAttempt      attempt1    = app1.GetCurrentAppAttempt();
            MockAM            am1         = MockRM.LaunchAndRegisterAM(app1, rm1, nm1);
            CapacityScheduler scheduler   = (CapacityScheduler)rm1.GetResourceScheduler();
            ContainerId       amContainer = ContainerId.NewContainerId(am1.GetApplicationAttemptId(
                                                                           ), 1);

            // Forcibly preempt the am container;
            scheduler.KillContainer(scheduler.GetRMContainer(amContainer));
            am1.WaitForState(RMAppAttemptState.Failed);
            NUnit.Framework.Assert.IsTrue(!attempt1.ShouldCountTowardsMaxAttemptRetry());
            rm1.WaitForState(app1.GetApplicationId(), RMAppState.Accepted);
            // state store has 1 attempt stored.
            ApplicationStateData appState = memStore.GetState().GetApplicationState()[app1.GetApplicationId
                                                                                          ()];

            NUnit.Framework.Assert.AreEqual(1, appState.GetAttemptCount());
            // attempt stored has the preempted container exit status.
            NUnit.Framework.Assert.AreEqual(ContainerExitStatus.Preempted, appState.GetAttempt
                                                (am1.GetApplicationAttemptId()).GetAMContainerExitStatus());
            // Restart rm.
            MockRM rm2 = new MockRM(conf, memStore);

            nm1.SetResourceTrackerService(rm2.GetResourceTrackerService());
            nm1.RegisterNode();
            rm2.Start();
            // Restarted RM should re-launch the am.
            MockAM am2 = rm2.WaitForNewAMToLaunchAndRegister(app1.GetApplicationId(), 2, nm1);

            MockRM.FinishAMAndVerifyAppState(app1, rm2, nm1, am2);
            RMAppAttempt attempt2 = rm2.GetRMContext().GetRMApps()[app1.GetApplicationId()].GetCurrentAppAttempt
                                        ();

            NUnit.Framework.Assert.IsTrue(attempt2.ShouldCountTowardsMaxAttemptRetry());
            NUnit.Framework.Assert.AreEqual(ContainerExitStatus.Invalid, appState.GetAttempt(
                                                am2.GetApplicationAttemptId()).GetAMContainerExitStatus());
            rm1.Stop();
            rm2.Stop();
        }
Beispiel #7
0
        public virtual void TestMoveAppToPlanQueue()
        {
            CapacityScheduler scheduler = (CapacityScheduler)rm.GetResourceScheduler();
            // submit an app
            RMApp app = rm.SubmitApp(Gb, "test-move-1", "user_0", null, "b1");
            ApplicationAttemptId appAttemptId = rm.GetApplicationReport(app.GetApplicationId(
                                                                            )).GetCurrentApplicationAttemptId();
            // check preconditions
            IList <ApplicationAttemptId> appsInB1 = scheduler.GetAppsInQueue("b1");

            NUnit.Framework.Assert.AreEqual(1, appsInB1.Count);
            IList <ApplicationAttemptId> appsInB = scheduler.GetAppsInQueue("b");

            NUnit.Framework.Assert.AreEqual(1, appsInB.Count);
            NUnit.Framework.Assert.IsTrue(appsInB.Contains(appAttemptId));
            IList <ApplicationAttemptId> appsInA = scheduler.GetAppsInQueue("a");

            NUnit.Framework.Assert.IsTrue(appsInA.IsEmpty());
            string queue = scheduler.GetApplicationAttempt(appsInB1[0]).GetQueue().GetQueueName
                               ();

            NUnit.Framework.Assert.IsTrue(queue.Equals("b1"));
            IList <ApplicationAttemptId> appsInRoot = scheduler.GetAppsInQueue("root");

            NUnit.Framework.Assert.IsTrue(appsInRoot.Contains(appAttemptId));
            NUnit.Framework.Assert.AreEqual(1, appsInRoot.Count);
            // create the default reservation queue
            string           defQName = "a" + ReservationConstants.DefaultQueueSuffix;
            ReservationQueue defQ     = new ReservationQueue(scheduler, defQName, (PlanQueue)scheduler
                                                             .GetQueue("a"));

            scheduler.AddQueue(defQ);
            defQ.SetEntitlement(new QueueEntitlement(1f, 1f));
            IList <ApplicationAttemptId> appsInDefQ = scheduler.GetAppsInQueue(defQName);

            NUnit.Framework.Assert.IsTrue(appsInDefQ.IsEmpty());
            // now move the app to plan queue
            scheduler.MoveApplication(app.GetApplicationId(), "a");
            // check postconditions
            appsInDefQ = scheduler.GetAppsInQueue(defQName);
            NUnit.Framework.Assert.AreEqual(1, appsInDefQ.Count);
            queue = scheduler.GetApplicationAttempt(appsInDefQ[0]).GetQueue().GetQueueName();
            NUnit.Framework.Assert.IsTrue(queue.Equals(defQName));
            appsInA = scheduler.GetAppsInQueue("a");
            NUnit.Framework.Assert.IsTrue(appsInA.Contains(appAttemptId));
            NUnit.Framework.Assert.AreEqual(1, appsInA.Count);
            appsInRoot = scheduler.GetAppsInQueue("root");
            NUnit.Framework.Assert.IsTrue(appsInRoot.Contains(appAttemptId));
            NUnit.Framework.Assert.AreEqual(1, appsInRoot.Count);
            appsInB1 = scheduler.GetAppsInQueue("b1");
            NUnit.Framework.Assert.IsTrue(appsInB1.IsEmpty());
            appsInB = scheduler.GetAppsInQueue("b");
            NUnit.Framework.Assert.IsTrue(appsInB.IsEmpty());
            rm.Stop();
        }
Beispiel #8
0
        // This is to test AM Host and rpc port are invalidated after the am attempt
        // is killed or failed, so that client doesn't get the wrong information.
        /// <exception cref="System.Exception"/>
        public virtual void TestInvalidateAMHostPortWhenAMFailedOrKilled()
        {
            conf.SetInt(YarnConfiguration.RmAmMaxAttempts, 1);
            MockRM rm1 = new MockRM(conf);

            rm1.Start();
            // a succeeded app
            RMApp  app1 = rm1.SubmitApp(200);
            MockNM nm1  = new MockNM("127.0.0.1:1234", 15120, rm1.GetResourceTrackerService());

            nm1.RegisterNode();
            MockAM am1 = MockRM.LaunchAndRegisterAM(app1, rm1, nm1);

            MockRM.FinishAMAndVerifyAppState(app1, rm1, nm1, am1);
            // a failed app
            RMApp  app2 = rm1.SubmitApp(200);
            MockAM am2  = MockRM.LaunchAndRegisterAM(app2, rm1, nm1);

            nm1.NodeHeartbeat(am2.GetApplicationAttemptId(), 1, ContainerState.Complete);
            am2.WaitForState(RMAppAttemptState.Failed);
            rm1.WaitForState(app2.GetApplicationId(), RMAppState.Failed);
            // a killed app
            RMApp  app3 = rm1.SubmitApp(200);
            MockAM am3  = MockRM.LaunchAndRegisterAM(app3, rm1, nm1);

            rm1.KillApp(app3.GetApplicationId());
            rm1.WaitForState(app3.GetApplicationId(), RMAppState.Killed);
            rm1.WaitForState(am3.GetApplicationAttemptId(), RMAppAttemptState.Killed);
            GetApplicationsRequest request1 = GetApplicationsRequest.NewInstance(EnumSet.Of(YarnApplicationState
                                                                                            .Finished, YarnApplicationState.Killed, YarnApplicationState.Failed));
            GetApplicationsResponse response1 = rm1.GetClientRMService().GetApplications(request1
                                                                                         );
            IList <ApplicationReport> appList1 = response1.GetApplicationList();

            NUnit.Framework.Assert.AreEqual(3, appList1.Count);
            foreach (ApplicationReport report in appList1)
            {
                // killed/failed apps host and rpc port are invalidated.
                if (report.GetApplicationId().Equals(app2.GetApplicationId()) || report.GetApplicationId
                        ().Equals(app3.GetApplicationId()))
                {
                    NUnit.Framework.Assert.AreEqual("N/A", report.GetHost());
                    NUnit.Framework.Assert.AreEqual(-1, report.GetRpcPort());
                }
                // succeeded app's host and rpc port is not invalidated
                if (report.GetApplicationId().Equals(app1.GetApplicationId()))
                {
                    NUnit.Framework.Assert.IsFalse(report.GetHost().Equals("N/A"));
                    NUnit.Framework.Assert.IsTrue(report.GetRpcPort() != -1);
                }
            }
        }
        /// <exception cref="System.Exception"/>
        public virtual void TestAppCleanupWhenRMRestartedBeforeAppFinished()
        {
            conf.SetInt(YarnConfiguration.RmAmMaxAttempts, 1);
            MemoryRMStateStore memStore = new MemoryRMStateStore();

            memStore.Init(conf);
            // start RM
            MockRM rm1 = new MockRM(conf, memStore);

            rm1.Start();
            MockNM nm1 = new MockNM("127.0.0.1:1234", 1024, rm1.GetResourceTrackerService());

            nm1.RegisterNode();
            MockNM nm2 = new MockNM("127.0.0.1:5678", 1024, rm1.GetResourceTrackerService());

            nm2.RegisterNode();
            // create app and launch the AM
            RMApp  app0 = rm1.SubmitApp(200);
            MockAM am0  = LaunchAM(app0, rm1, nm1);
            // alloc another container on nm2
            AllocateResponse allocResponse = am0.Allocate(Arrays.AsList(ResourceRequest.NewInstance
                                                                            (Priority.NewInstance(1), "*", Resource.NewInstance(1024, 0), 1)), null);

            while (null == allocResponse.GetAllocatedContainers() || allocResponse.GetAllocatedContainers
                       ().IsEmpty())
            {
                nm2.NodeHeartbeat(true);
                allocResponse = am0.Allocate(null, null);
                Sharpen.Thread.Sleep(1000);
            }
            // start new RM
            MockRM rm2 = new MockRM(conf, memStore);

            rm2.Start();
            // nm1/nm2 register to rm2, and do a heartbeat
            nm1.SetResourceTrackerService(rm2.GetResourceTrackerService());
            nm1.RegisterNode(Arrays.AsList(NMContainerStatus.NewInstance(ContainerId.NewContainerId
                                                                             (am0.GetApplicationAttemptId(), 1), ContainerState.Complete, Resource.NewInstance
                                                                             (1024, 1), string.Empty, 0, Priority.NewInstance(0), 1234)), Arrays.AsList(app0.
                                                                                                                                                        GetApplicationId()));
            nm2.SetResourceTrackerService(rm2.GetResourceTrackerService());
            nm2.RegisterNode(Arrays.AsList(app0.GetApplicationId()));
            // assert app state has been saved.
            rm2.WaitForState(app0.GetApplicationId(), RMAppState.Failed);
            // wait for application cleanup message received on NM1
            WaitForAppCleanupMessageRecved(nm1, app0.GetApplicationId());
            // wait for application cleanup message received on NM2
            WaitForAppCleanupMessageRecved(nm2, app0.GetApplicationId());
            rm1.Stop();
            rm2.Stop();
        }
Beispiel #10
0
 /*
  * check to see if hit the limit for max # completed apps kept
  */
 protected internal virtual void CheckAppNumCompletedLimit()
 {
     lock (this)
     {
         // check apps kept in state store.
         while (completedAppsInStateStore > this.maxCompletedAppsInStateStore)
         {
             ApplicationId removeId = completedApps[completedApps.Count - completedAppsInStateStore
                                      ];
             RMApp removeApp = rmContext.GetRMApps()[removeId];
             Log.Info("Max number of completed apps kept in state store met:" + " maxCompletedAppsInStateStore = "
                      + maxCompletedAppsInStateStore + ", removing app " + removeApp.GetApplicationId
                          () + " from state store.");
             rmContext.GetStateStore().RemoveApplication(removeApp);
             completedAppsInStateStore--;
         }
         // check apps kept in memorty.
         while (completedApps.Count > this.maxCompletedAppsInMemory)
         {
             ApplicationId removeId = completedApps.Remove();
             Log.Info("Application should be expired, max number of completed apps" + " kept in memory met: maxCompletedAppsInMemory = "
                      + this.maxCompletedAppsInMemory + ", removing app " + removeId + " from memory: "
                      );
             Sharpen.Collections.Remove(rmContext.GetRMApps(), removeId);
             this.applicationACLsManager.RemoveApplication(removeId);
         }
     }
 }
Beispiel #11
0
        private static RMApp CreateRMApp(ApplicationId appId)
        {
            RMApp app = Org.Mockito.Mockito.Mock <RMApp>();

            Org.Mockito.Mockito.When(app.GetApplicationId()).ThenReturn(appId);
            Org.Mockito.Mockito.When(app.GetName()).ThenReturn("test app");
            Org.Mockito.Mockito.When(app.GetApplicationType()).ThenReturn("test app type");
            Org.Mockito.Mockito.When(app.GetUser()).ThenReturn("test user");
            Org.Mockito.Mockito.When(app.GetQueue()).ThenReturn("test queue");
            Org.Mockito.Mockito.When(app.GetSubmitTime()).ThenReturn(int.MaxValue + 1L);
            Org.Mockito.Mockito.When(app.GetStartTime()).ThenReturn(int.MaxValue + 2L);
            Org.Mockito.Mockito.When(app.GetFinishTime()).ThenReturn(int.MaxValue + 3L);
            Org.Mockito.Mockito.When(app.GetDiagnostics()).ThenReturn(new StringBuilder("test diagnostics info"
                                                                                        ));
            RMAppAttempt appAttempt = Org.Mockito.Mockito.Mock <RMAppAttempt>();

            Org.Mockito.Mockito.When(appAttempt.GetAppAttemptId()).ThenReturn(ApplicationAttemptId
                                                                              .NewInstance(appId, 1));
            Org.Mockito.Mockito.When(app.GetCurrentAppAttempt()).ThenReturn(appAttempt);
            Org.Mockito.Mockito.When(app.GetFinalApplicationStatus()).ThenReturn(FinalApplicationStatus
                                                                                 .Undefined);
            Org.Mockito.Mockito.When(app.GetRMAppMetrics()).ThenReturn(new RMAppMetrics(null,
                                                                                        0, 0, int.MaxValue, long.MaxValue));
            return(app);
        }
Beispiel #12
0
            /// <exception cref="System.IO.IOException"/>
            public virtual bool AppExists(RMApp app)
            {
                FileSystem fs       = this.cluster.GetFileSystem();
                Path       nodePath = this.store.GetAppDir(app.GetApplicationId().ToString());

                return(fs.Exists(nodePath));
            }
Beispiel #13
0
        /// <exception cref="System.Exception"/>
        public virtual void TestInvalidatedAMHostPortOnAMRestart()
        {
            MockRM rm1 = new MockRM(conf);

            rm1.Start();
            MockNM nm1 = new MockNM("127.0.0.1:1234", 15120, rm1.GetResourceTrackerService());

            nm1.RegisterNode();
            // a failed app
            RMApp  app2 = rm1.SubmitApp(200);
            MockAM am2  = MockRM.LaunchAndRegisterAM(app2, rm1, nm1);

            nm1.NodeHeartbeat(am2.GetApplicationAttemptId(), 1, ContainerState.Complete);
            am2.WaitForState(RMAppAttemptState.Failed);
            rm1.WaitForState(app2.GetApplicationId(), RMAppState.Accepted);
            // before new attempt is launched, the app report returns the invalid AM
            // host and port.
            GetApplicationReportRequest request1 = GetApplicationReportRequest.NewInstance(app2
                                                                                           .GetApplicationId());
            ApplicationReport report1 = rm1.GetClientRMService().GetApplicationReport(request1
                                                                                      ).GetApplicationReport();

            NUnit.Framework.Assert.AreEqual("N/A", report1.GetHost());
            NUnit.Framework.Assert.AreEqual(-1, report1.GetRpcPort());
        }
Beispiel #14
0
            /// <exception cref="System.Exception"/>
            public virtual bool AppExists(RMApp app)
            {
                Stat node = this.client.Exists(this.store.GetAppNode(app.GetApplicationId().ToString
                                                                         ()), false);

                return(node != null);
            }
Beispiel #15
0
        /// <exception cref="System.Exception"/>
        public virtual void TestRMAppSubmitDuplicateApplicationId()
        {
            ApplicationId appId = MockApps.NewAppID(0);

            asContext.SetApplicationId(appId);
            RMApp appOrig = rmContext.GetRMApps()[appId];

            NUnit.Framework.Assert.IsTrue("app name matches but shouldn't", "testApp1" != appOrig
                                          .GetName());
            // our testApp1 should be rejected and original app with same id should be left in place
            try
            {
                appMonitor.SubmitApplication(asContext, "test");
                NUnit.Framework.Assert.Fail("Exception is expected when applicationId is duplicate."
                                            );
            }
            catch (YarnException e)
            {
                NUnit.Framework.Assert.IsTrue("The thrown exception is not the expectd one.", e.Message
                                              .Contains("Cannot add a duplicate!"));
            }
            // make sure original app didn't get removed
            RMApp app = rmContext.GetRMApps()[appId];

            NUnit.Framework.Assert.IsNotNull("app is null", app);
            NUnit.Framework.Assert.AreEqual("app id doesn't match", appId, app.GetApplicationId
                                                ());
            NUnit.Framework.Assert.AreEqual("app state doesn't match", RMAppState.Finished, app
                                            .GetState());
        }
        /// <exception cref="System.Exception"/>
        public virtual void TestMoveSuccessful()
        {
            MockRM rm1 = new MockRM(conf);

            rm1.Start();
            RMApp           app             = rm1.SubmitApp(1024);
            ClientRMService clientRMService = rm1.GetClientRMService();

            // FIFO scheduler does not support moves
            clientRMService.MoveApplicationAcrossQueues(MoveApplicationAcrossQueuesRequest.NewInstance
                                                            (app.GetApplicationId(), "newqueue"));
            RMApp rmApp = rm1.GetRMContext().GetRMApps()[app.GetApplicationId()];

            NUnit.Framework.Assert.AreEqual("newqueue", rmApp.GetQueue());
            rm1.Stop();
        }
Beispiel #17
0
        public virtual void TestEscapeApplicationSummary()
        {
            RMApp app = Org.Mockito.Mockito.Mock <RMAppImpl>();

            Org.Mockito.Mockito.When(app.GetApplicationId()).ThenReturn(ApplicationId.NewInstance
                                                                            (100L, 1));
            Org.Mockito.Mockito.When(app.GetName()).ThenReturn("Multiline\n\n\r\rAppName");
            Org.Mockito.Mockito.When(app.GetUser()).ThenReturn("Multiline\n\n\r\rUserName");
            Org.Mockito.Mockito.When(app.GetQueue()).ThenReturn("Multiline\n\n\r\rQueueName");
            Org.Mockito.Mockito.When(app.GetState()).ThenReturn(RMAppState.Running);
            Org.Mockito.Mockito.When(app.GetApplicationType()).ThenReturn("MAPREDUCE");
            RMAppMetrics metrics = new RMAppMetrics(Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                                    .NewInstance(1234, 56), 10, 1, 16384, 64);

            Org.Mockito.Mockito.When(app.GetRMAppMetrics()).ThenReturn(metrics);
            RMAppManager.ApplicationSummary.SummaryBuilder summary = RMAppManager.ApplicationSummary
                                                                     .CreateAppSummary(app);
            string msg = summary.ToString();

            Log.Info("summary: " + msg);
            NUnit.Framework.Assert.IsFalse(msg.Contains("\n"));
            NUnit.Framework.Assert.IsFalse(msg.Contains("\r"));
            string escaped = "\\n\\n\\r\\r";

            NUnit.Framework.Assert.IsTrue(msg.Contains("Multiline" + escaped + "AppName"));
            NUnit.Framework.Assert.IsTrue(msg.Contains("Multiline" + escaped + "UserName"));
            NUnit.Framework.Assert.IsTrue(msg.Contains("Multiline" + escaped + "QueueName"));
            NUnit.Framework.Assert.IsTrue(msg.Contains("memorySeconds=16384"));
            NUnit.Framework.Assert.IsTrue(msg.Contains("vcoreSeconds=64"));
            NUnit.Framework.Assert.IsTrue(msg.Contains("preemptedAMContainers=1"));
            NUnit.Framework.Assert.IsTrue(msg.Contains("preemptedNonAMContainers=10"));
            NUnit.Framework.Assert.IsTrue(msg.Contains("preemptedResources=<memory:1234\\, vCores:56>"
                                                       ));
            NUnit.Framework.Assert.IsTrue(msg.Contains("applicationType=MAPREDUCE"));
        }
Beispiel #18
0
 /// <exception cref="System.Exception"/>
 public virtual bool AppExists(RMApp app)
 {
     if (this._enclosing.stateStore.IsClosed())
     {
         this.GetRMStateStore();
     }
     return(this._enclosing.stateStore.LoadRMAppState(app.GetApplicationId()) != null);
 }
Beispiel #19
0
 public virtual void AppACLsUpdated(RMApp app, string appViewACLs, long updatedTime
                                    )
 {
     if (publishSystemMetrics)
     {
         dispatcher.GetEventHandler().Handle(new ApplicationACLsUpdatedEvent(app.GetApplicationId
                                                                                 (), appViewACLs == null ? string.Empty : appViewACLs, updatedTime));
     }
 }
Beispiel #20
0
 public virtual void AppCreated(RMApp app, long createdTime)
 {
     if (publishSystemMetrics)
     {
         dispatcher.GetEventHandler().Handle(new ApplicationCreatedEvent(app.GetApplicationId
                                                                             (), app.GetName(), app.GetApplicationType(), app.GetUser(), app.GetQueue(), app.
                                                                         GetSubmitTime(), createdTime));
     }
 }
Beispiel #21
0
        /// <exception cref="System.Exception"/>
        public static MockAM LaunchAndRegisterAM(RMApp app, Org.Apache.Hadoop.Yarn.Server.Resourcemanager.MockRM
                                                 rm, MockNM nm)
        {
            MockAM am = LaunchAM(app, rm, nm);

            am.RegisterAppAttempt();
            rm.WaitForState(app.GetApplicationId(), RMAppState.Running);
            return(am);
        }
Beispiel #22
0
        /// <summary>Validate killing an application when it is at accepted state.</summary>
        /// <exception cref="System.Exception">exception</exception>
        public virtual void TestApplicationKillAtAcceptedState()
        {
            Dispatcher dispatcher = new _AsyncDispatcher_573();
            MockRM     rm         = new _MockRM_596(dispatcher, conf);
            // test metrics
            QueueMetrics metrics       = rm.GetResourceScheduler().GetRootQueueMetrics();
            int          appsKilled    = metrics.GetAppsKilled();
            int          appsSubmitted = metrics.GetAppsSubmitted();

            rm.Start();
            MockNM nm1 = new MockNM("127.0.0.1:1234", 15120, rm.GetResourceTrackerService());

            nm1.RegisterNode();
            // a failed app
            RMApp  application = rm.SubmitApp(200);
            MockAM am          = MockRM.LaunchAM(application, rm, nm1);

            am.WaitForState(RMAppAttemptState.Launched);
            nm1.NodeHeartbeat(am.GetApplicationAttemptId(), 1, ContainerState.Running);
            rm.WaitForState(application.GetApplicationId(), RMAppState.Accepted);
            // Now kill the application before new attempt is launched, the app report
            // returns the invalid AM host and port.
            KillApplicationRequest request = KillApplicationRequest.NewInstance(application.GetApplicationId
                                                                                    ());

            rm.GetClientRMService().ForceKillApplication(request);
            // Specific test for YARN-1689 follows
            // Now let's say a race causes AM to register now. This should not crash RM.
            am.RegisterAppAttempt(false);
            // We explicitly intercepted the kill-event to RMAppAttempt, so app should
            // still be in KILLING state.
            rm.WaitForState(application.GetApplicationId(), RMAppState.Killing);
            // AM should now be in running
            rm.WaitForState(am.GetApplicationAttemptId(), RMAppAttemptState.Running);
            // Simulate that appAttempt is killed.
            rm.GetRMContext().GetDispatcher().GetEventHandler().Handle(new RMAppEvent(application
                                                                                      .GetApplicationId(), RMAppEventType.AttemptKilled));
            rm.WaitForState(application.GetApplicationId(), RMAppState.Killed);
            // test metrics
            metrics = rm.GetResourceScheduler().GetRootQueueMetrics();
            NUnit.Framework.Assert.AreEqual(appsKilled + 1, metrics.GetAppsKilled());
            NUnit.Framework.Assert.AreEqual(appsSubmitted + 1, metrics.GetAppsSubmitted());
        }
Beispiel #23
0
 public virtual void AppFinished(RMApp app, RMAppState state, long finishedTime)
 {
     if (publishSystemMetrics)
     {
         dispatcher.GetEventHandler().Handle(new ApplicationFinishedEvent(app.GetApplicationId
                                                                              (), app.GetDiagnostics().ToString(), app.GetFinalApplicationStatus(), RMServerUtils
                                                                          .CreateApplicationState(state), app.GetCurrentAppAttempt() == null ? null : app.
                                                                          GetCurrentAppAttempt().GetAppAttemptId(), finishedTime, app.GetRMAppMetrics()));
     }
 }
 public virtual void ApplicationStarted(RMApp app)
 {
     if (historyServiceEnabled)
     {
         dispatcher.GetEventHandler().Handle(new WritingApplicationStartEvent(app.GetApplicationId
                                                                                  (), ApplicationStartData.NewInstance(app.GetApplicationId(), app.GetName(), app.
                                                                                                                       GetApplicationType(), app.GetQueue(), app.GetUser(), app.GetSubmitTime(), app.GetStartTime
                                                                                                                           ())));
     }
 }
        public virtual void TestHandleRMHAafterSubmitApplicationCallWithoutSavedApplicationState
            ()
        {
            // Test scenario 2 when RM failover happens
            // after SubmitApplication Call:
            // RMStateStore did not save the ApplicationState when failover happens.
            // Using customized RMAppManager.
            StartRMsWithCustomizedRMAppManager();
            // Submit Application
            // After submission, the applicationState will
            // not be saved in RMStateStore
            RMApp app0 = rm1.SubmitApp(200, string.Empty, UserGroupInformation.GetCurrentUser
                                           ().GetShortUserName(), null, false, null, configuration.GetInt(YarnConfiguration
                                                                                                          .RmAmMaxAttempts, YarnConfiguration.DefaultRmAmMaxAttempts), null, null, false,
                                       false);

            // Do the failover
            ExplicitFailover();
            // Since the applicationState is not saved in RMStateStore
            // when failover happens. The current active RM can not load
            // previous applicationState.
            // Expect ApplicationNotFoundException by calling getApplicationReport().
            try
            {
                rm2.GetApplicationReport(app0.GetApplicationId());
                NUnit.Framework.Assert.Fail("Should get ApplicationNotFoundException here");
            }
            catch (ApplicationNotFoundException)
            {
            }
            // expected ApplicationNotFoundException
            // Submit the application with previous ApplicationId to current active RM
            // This will mimic the similar behavior of YarnClient which will re-submit
            // Application with previous applicationId
            // when catches the ApplicationNotFoundException
            RMApp app1 = rm2.SubmitApp(200, string.Empty, UserGroupInformation.GetCurrentUser
                                           ().GetShortUserName(), null, false, null, configuration.GetInt(YarnConfiguration
                                                                                                          .RmAmMaxAttempts, YarnConfiguration.DefaultRmAmMaxAttempts), null, null, false,
                                       false, true, app0.GetApplicationId());

            VerifySubmitApp(rm2, app1, app0.GetApplicationId());
        }
Beispiel #26
0
        // Test Kill an app while the app is failing
        /// <exception cref="System.Exception"/>
        public virtual void TestKillFailingApp()
        {
            // this dispatcher ignores RMAppAttemptEventType.KILL event
            Dispatcher dispatcher = new _AsyncDispatcher_708();
            MockRM     rm1        = new _MockRM_731(dispatcher, conf);

            rm1.Start();
            MockNM nm1 = new MockNM("127.0.0.1:1234", 8192, rm1.GetResourceTrackerService());

            nm1.RegisterNode();
            RMApp  app1 = rm1.SubmitApp(200);
            MockAM am1  = MockRM.LaunchAndRegisterAM(app1, rm1, nm1);

            rm1.KillApp(app1.GetApplicationId());
            // fail the app by sending container_finished event.
            nm1.NodeHeartbeat(am1.GetApplicationAttemptId(), 1, ContainerState.Complete);
            rm1.WaitForState(am1.GetApplicationAttemptId(), RMAppAttemptState.Failed);
            // app is killed, not launching a new attempt
            rm1.WaitForState(app1.GetApplicationId(), RMAppState.Killed);
        }
        /// <exception cref="System.Exception"/>
        private MockAM LaunchAM(RMApp app, MockRM rm, MockNM nm)
        {
            RMAppAttempt attempt = app.GetCurrentAppAttempt();

            nm.NodeHeartbeat(true);
            MockAM am = rm.SendAMLaunched(attempt.GetAppAttemptId());

            am.RegisterAppAttempt();
            rm.WaitForState(app.GetApplicationId(), RMAppState.Running);
            return(am);
        }
Beispiel #28
0
        // Disable webapp
        /// <exception cref="System.Exception"/>
        public static void FinishAMAndVerifyAppState(RMApp rmApp, Org.Apache.Hadoop.Yarn.Server.Resourcemanager.MockRM
                                                     rm, MockNM nm, MockAM am)
        {
            FinishApplicationMasterRequest req = FinishApplicationMasterRequest.NewInstance(FinalApplicationStatus
                                                                                            .Succeeded, string.Empty, string.Empty);

            am.UnregisterAppAttempt(req, true);
            am.WaitForState(RMAppAttemptState.Finishing);
            nm.NodeHeartbeat(am.GetApplicationAttemptId(), 1, ContainerState.Complete);
            am.WaitForState(RMAppAttemptState.Finished);
            rm.WaitForState(rmApp.GetApplicationId(), RMAppState.Finished);
        }
Beispiel #29
0
        // Test even if AM container is allocated with containerId not equal to 1, the
        // following allocate requests from AM should be able to retrieve the
        // corresponding NM Token.
        /// <exception cref="System.Exception"/>
        public virtual void TestNMTokenSentForNormalContainer()
        {
            conf.Set(YarnConfiguration.RmScheduler, typeof(CapacityScheduler).GetCanonicalName
                         ());
            MockRM rm = new MockRM(conf);

            rm.Start();
            MockNM       nm1     = rm.RegisterNode("h1:1234", 5120);
            RMApp        app     = rm.SubmitApp(2000);
            RMAppAttempt attempt = app.GetCurrentAppAttempt();
            // Call getNewContainerId to increase container Id so that the AM container
            // Id doesn't equal to one.
            CapacityScheduler cs = (CapacityScheduler)rm.GetResourceScheduler();

            cs.GetApplicationAttempt(attempt.GetAppAttemptId()).GetNewContainerId();
            // kick the scheduling
            nm1.NodeHeartbeat(true);
            MockAM am = MockRM.LaunchAM(app, rm, nm1);

            // am container Id not equal to 1.
            NUnit.Framework.Assert.IsTrue(attempt.GetMasterContainer().GetId().GetContainerId
                                              () != 1);
            // NMSecretManager doesn't record the node on which the am is allocated.
            NUnit.Framework.Assert.IsFalse(rm.GetRMContext().GetNMTokenSecretManager().IsApplicationAttemptNMTokenPresent
                                               (attempt.GetAppAttemptId(), nm1.GetNodeId()));
            am.RegisterAppAttempt();
            rm.WaitForState(app.GetApplicationId(), RMAppState.Running);
            int NumContainers            = 1;
            IList <Container> containers = new AList <Container>();
            // nmTokens keeps track of all the nmTokens issued in the allocate call.
            IList <NMToken> expectedNMTokens = new AList <NMToken>();

            // am1 allocate 1 container on nm1.
            while (true)
            {
                AllocateResponse response = am.Allocate("127.0.0.1", 2000, NumContainers, new AList
                                                        <ContainerId>());
                nm1.NodeHeartbeat(true);
                Sharpen.Collections.AddAll(containers, response.GetAllocatedContainers());
                Sharpen.Collections.AddAll(expectedNMTokens, response.GetNMTokens());
                if (containers.Count == NumContainers)
                {
                    break;
                }
                Sharpen.Thread.Sleep(200);
                System.Console.Out.WriteLine("Waiting for container to be allocated.");
            }
            NodeId nodeId = expectedNMTokens[0].GetNodeId();

            // NMToken is sent for the allocated container.
            NUnit.Framework.Assert.AreEqual(nm1.GetNodeId(), nodeId);
        }
Beispiel #30
0
        /// <exception cref="System.Exception"/>
        private void CheckAppQueue(MockRM resourceManager, string user, string submissionQueue
                                   , string expected)
        {
            RMApp app = resourceManager.SubmitApp(200, "name", user, new Dictionary <ApplicationAccessType
                                                                                     , string>(), false, submissionQueue, -1, null, "MAPREDUCE", false);
            RMAppState expectedState = expected.IsEmpty() ? RMAppState.Failed : RMAppState.Accepted;

            resourceManager.WaitForState(app.GetApplicationId(), expectedState);
            // get scheduler app
            CapacityScheduler    cs           = (CapacityScheduler)resourceManager.GetResourceScheduler();
            SchedulerApplication schedulerApp = cs.GetSchedulerApplications()[app.GetApplicationId
                                                                                  ()];
            string queue = string.Empty;

            if (schedulerApp != null)
            {
                queue = schedulerApp.GetQueue().GetQueueName();
            }
            NUnit.Framework.Assert.IsTrue("expected " + expected + " actual " + queue, expected
                                          .Equals(queue));
            NUnit.Framework.Assert.AreEqual(expected, app.GetQueue());
        }