Ejemplo n.º 1
0
            /// <exception cref="Org.Apache.Hadoop.Yarn.Exceptions.YarnException"/>
            public virtual StartContainersResponse StartContainers(StartContainersRequest requests
                                                                   )
            {
                StartContainersResponse response = TestRPC.recordFactory.NewRecordInstance <StartContainersResponse
                                                                                            >();

                foreach (StartContainerRequest request in requests.GetStartContainerRequests())
                {
                    Token containerToken             = request.GetContainerToken();
                    ContainerTokenIdentifier tokenId = null;
                    try
                    {
                        tokenId = TestRPC.NewContainerTokenIdentifier(containerToken);
                    }
                    catch (IOException e)
                    {
                        throw RPCUtil.GetRemoteException(e);
                    }
                    ContainerStatus status = TestRPC.recordFactory.NewRecordInstance <ContainerStatus>
                                                 ();
                    status.SetState(ContainerState.Running);
                    status.SetContainerId(tokenId.GetContainerID());
                    status.SetExitStatus(0);
                    this.statuses.AddItem(status);
                }
                return(response);
            }
Ejemplo n.º 2
0
        private ContainerStatus GetContainerStatus(int applicationId, int containerID, int
                                                   appAttemptId)
        {
            ContainerStatus status = recordFactory.NewRecordInstance <ContainerStatus>();

            status.SetContainerId(GetContainerId(containerID, appAttemptId));
            return(status);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Utility to create a
        /// <see cref="Org.Apache.Hadoop.Yarn.Api.Records.ContainerStatus"/>
        /// during exceptional
        /// circumstances.
        /// </summary>
        /// <param name="containerId">
        ///
        /// <see cref="Org.Apache.Hadoop.Yarn.Api.Records.ContainerId"/>
        /// of returned/released/lost container.
        /// </param>
        /// <param name="diagnostics">diagnostic message</param>
        /// <returns>
        /// <code>ContainerStatus</code> for an returned/released/lost
        /// container
        /// </returns>
        private static ContainerStatus CreateAbnormalContainerStatus(ContainerId containerId
                                                                     , int exitStatus, string diagnostics)
        {
            ContainerStatus containerStatus = recordFactory.NewRecordInstance <ContainerStatus
                                                                               >();

            containerStatus.SetContainerId(containerId);
            containerStatus.SetDiagnostics(diagnostics);
            containerStatus.SetExitStatus(exitStatus);
            containerStatus.SetState(ContainerState.Complete);
            return(containerStatus);
        }
Ejemplo n.º 4
0
        public static ContainerStatus NewContainerStatus(ContainerId containerId, ContainerState
                                                         containerState, string diagnostics, int exitStatus)
        {
            ContainerStatus containerStatus = recordFactory.NewRecordInstance <ContainerStatus
                                                                               >();

            containerStatus.SetState(containerState);
            containerStatus.SetContainerId(containerId);
            containerStatus.SetDiagnostics(diagnostics);
            containerStatus.SetExitStatus(exitStatus);
            return(containerStatus);
        }
Ejemplo n.º 5
0
        // AM container preempted, nm disk failure
        // should not be counted towards AM max retry count.
        /// <exception cref="System.Exception"/>
        public virtual void TestShouldNotCountFailureToMaxAttemptRetry()
        {
            YarnConfiguration conf = new YarnConfiguration();

            conf.SetClass(YarnConfiguration.RmScheduler, typeof(CapacityScheduler), typeof(ResourceScheduler
                                                                                           ));
            // explicitly set max-am-retry count as 1.
            conf.SetInt(YarnConfiguration.RmAmMaxAttempts, 1);
            conf.SetBoolean(YarnConfiguration.RecoveryEnabled, true);
            conf.Set(YarnConfiguration.RmStore, typeof(MemoryRMStateStore).FullName);
            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);

            // Preempt the first attempt;
            scheduler.KillContainer(scheduler.GetRMContainer(amContainer));
            am1.WaitForState(RMAppAttemptState.Failed);
            NUnit.Framework.Assert.IsTrue(!attempt1.ShouldCountTowardsMaxAttemptRetry());
            rm1.WaitForState(app1.GetApplicationId(), RMAppState.Accepted);
            ApplicationStateData appState = memStore.GetState().GetApplicationState()[app1.GetApplicationId
                                                                                          ()];
            // AM should be restarted even though max-am-attempt is 1.
            MockAM       am2      = rm1.WaitForNewAMToLaunchAndRegister(app1.GetApplicationId(), 2, nm1);
            RMAppAttempt attempt2 = app1.GetCurrentAppAttempt();

            NUnit.Framework.Assert.IsTrue(((RMAppAttemptImpl)attempt2).MayBeLastAttempt());
            // Preempt the second attempt.
            ContainerId amContainer2 = ContainerId.NewContainerId(am2.GetApplicationAttemptId
                                                                      (), 1);

            scheduler.KillContainer(scheduler.GetRMContainer(amContainer2));
            am2.WaitForState(RMAppAttemptState.Failed);
            NUnit.Framework.Assert.IsTrue(!attempt2.ShouldCountTowardsMaxAttemptRetry());
            rm1.WaitForState(app1.GetApplicationId(), RMAppState.Accepted);
            MockAM       am3      = rm1.WaitForNewAMToLaunchAndRegister(app1.GetApplicationId(), 3, nm1);
            RMAppAttempt attempt3 = app1.GetCurrentAppAttempt();

            NUnit.Framework.Assert.IsTrue(((RMAppAttemptImpl)attempt3).MayBeLastAttempt());
            // mimic NM disk_failure
            ContainerStatus containerStatus = Org.Apache.Hadoop.Yarn.Util.Records.NewRecord <ContainerStatus
                                                                                             >();

            containerStatus.SetContainerId(attempt3.GetMasterContainer().GetId());
            containerStatus.SetDiagnostics("mimic NM disk_failure");
            containerStatus.SetState(ContainerState.Complete);
            containerStatus.SetExitStatus(ContainerExitStatus.DisksFailed);
            IDictionary <ApplicationId, IList <ContainerStatus> > conts = new Dictionary <ApplicationId
                                                                                          , IList <ContainerStatus> >();

            conts[app1.GetApplicationId()] = Sharpen.Collections.SingletonList(containerStatus
                                                                               );
            nm1.NodeHeartbeat(conts, true);
            am3.WaitForState(RMAppAttemptState.Failed);
            NUnit.Framework.Assert.IsTrue(!attempt3.ShouldCountTowardsMaxAttemptRetry());
            NUnit.Framework.Assert.AreEqual(ContainerExitStatus.DisksFailed, appState.GetAttempt
                                                (am3.GetApplicationAttemptId()).GetAMContainerExitStatus());
            rm1.WaitForState(app1.GetApplicationId(), RMAppState.Accepted);
            MockAM       am4      = rm1.WaitForNewAMToLaunchAndRegister(app1.GetApplicationId(), 4, nm1);
            RMAppAttempt attempt4 = app1.GetCurrentAppAttempt();

            NUnit.Framework.Assert.IsTrue(((RMAppAttemptImpl)attempt4).MayBeLastAttempt());
            // create second NM, and register to rm1
            MockNM nm2 = new MockNM("127.0.0.1:2234", 8000, rm1.GetResourceTrackerService());

            nm2.RegisterNode();
            // nm1 heartbeats to report unhealthy
            // This will mimic ContainerExitStatus.ABORT
            nm1.NodeHeartbeat(false);
            am4.WaitForState(RMAppAttemptState.Failed);
            NUnit.Framework.Assert.IsTrue(!attempt4.ShouldCountTowardsMaxAttemptRetry());
            NUnit.Framework.Assert.AreEqual(ContainerExitStatus.Aborted, appState.GetAttempt(
                                                am4.GetApplicationAttemptId()).GetAMContainerExitStatus());
            // launch next AM in nm2
            nm2.NodeHeartbeat(true);
            MockAM       am5      = rm1.WaitForNewAMToLaunchAndRegister(app1.GetApplicationId(), 5, nm2);
            RMAppAttempt attempt5 = app1.GetCurrentAppAttempt();

            NUnit.Framework.Assert.IsTrue(((RMAppAttemptImpl)attempt5).MayBeLastAttempt());
            // fail the AM normally
            nm2.NodeHeartbeat(am5.GetApplicationAttemptId(), 1, ContainerState.Complete);
            am5.WaitForState(RMAppAttemptState.Failed);
            NUnit.Framework.Assert.IsTrue(attempt5.ShouldCountTowardsMaxAttemptRetry());
            // AM should not be restarted.
            rm1.WaitForState(app1.GetApplicationId(), RMAppState.Failed);
            NUnit.Framework.Assert.AreEqual(5, app1.GetAppAttempts().Count);
            rm1.Stop();
        }