示例#1
0
        /// <exception cref="Org.Apache.Hadoop.Yarn.Exceptions.YarnException"/>
        /// <exception cref="System.IO.IOException"/>
        public override void UnregisterApplicationMaster(FinalApplicationStatus appStatus
                                                         , string appMessage, string appTrackingUrl)
        {
            Preconditions.CheckArgument(appStatus != null, "AppStatus should not be null.");
            FinishApplicationMasterRequest request = FinishApplicationMasterRequest.NewInstance
                                                         (appStatus, appMessage, appTrackingUrl);

            try
            {
                while (true)
                {
                    FinishApplicationMasterResponse response = rmClient.FinishApplicationMaster(request
                                                                                                );
                    if (response.GetIsUnregistered())
                    {
                        break;
                    }
                    Log.Info("Waiting for application to be successfully unregistered.");
                    Sharpen.Thread.Sleep(100);
                }
            }
            catch (Exception)
            {
                Log.Info("Interrupted while waiting for application" + " to be removed from RMStateStore"
                         );
            }
            catch (ApplicationMasterNotRegisteredException)
            {
                Log.Warn("ApplicationMaster is out of sync with ResourceManager," + " hence resyncing."
                         );
                // re register with RM
                RegisterApplicationMaster();
                UnregisterApplicationMaster(appStatus, appMessage, appTrackingUrl);
            }
        }
示例#2
0
        /// <exception cref="System.Exception"/>
        public virtual void UnregisterAppAttempt(bool waitForStateRunning)
        {
            FinishApplicationMasterRequest req = FinishApplicationMasterRequest.NewInstance(FinalApplicationStatus
                                                                                            .Succeeded, string.Empty, string.Empty);

            UnregisterAppAttempt(req, waitForStateRunning);
        }
示例#3
0
                    /// <exception cref="System.IO.IOException"/>
                    public FinishApplicationMasterResponse FinishApplicationMaster(FinishApplicationMasterRequest
                                                                                   request)
                    {
                        FinishApplicationMasterResponse response = Org.Apache.Hadoop.Yarn.Util.Records.NewRecord
                                                                   <FinishApplicationMasterResponse>();

                        return(response);
                    }
        /// <exception cref="Org.Apache.Hadoop.Yarn.Exceptions.YarnException"/>
        /// <exception cref="System.IO.IOException"/>
        public virtual void TestFinishApplicationMasterOnHA()
        {
            FinishApplicationMasterRequest request = FinishApplicationMasterRequest.NewInstance
                                                         (FinalApplicationStatus.Succeeded, string.Empty, string.Empty);
            FinishApplicationMasterResponse response = amClient.FinishApplicationMaster(request
                                                                                        );

            NUnit.Framework.Assert.AreEqual(response, this.cluster.CreateFakeFinishApplicationMasterResponse
                                                ());
        }
示例#5
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);
        }
示例#6
0
 /// <exception cref="Org.Apache.Hadoop.Yarn.Exceptions.YarnException"/>
 /// <exception cref="System.IO.IOException"/>
 public virtual FinishApplicationMasterResponse FinishApplicationMaster(FinishApplicationMasterRequest
                                                                        request)
 {
     YarnServiceProtos.FinishApplicationMasterRequestProto requestProto = ((FinishApplicationMasterRequestPBImpl
                                                                            )request).GetProto();
     try
     {
         return(new FinishApplicationMasterResponsePBImpl(proxy.FinishApplicationMaster(null
                                                                                        , requestProto)));
     }
     catch (ServiceException e)
     {
         RPCUtil.UnwrapAndThrowException(e);
         return(null);
     }
 }
        /// <exception cref="Org.Apache.Hadoop.Yarn.Exceptions.YarnException"/>
        /// <exception cref="System.IO.IOException"/>
        public virtual FinishApplicationMasterResponse FinishApplicationMaster(FinishApplicationMasterRequest
                                                                               request)
        {
            ApplicationAttemptId applicationAttemptId = AuthorizeRequest().GetApplicationAttemptId
                                                            ();
            ApplicationId appId = applicationAttemptId.GetApplicationId();
            RMApp         rmApp = rmContext.GetRMApps()[applicationAttemptId.GetApplicationId()];

            // checking whether the app exits in RMStateStore at first not to throw
            // ApplicationDoesNotExistInCacheException before and after
            // RM work-preserving restart.
            if (rmApp.IsAppFinalStateStored())
            {
                Log.Info(rmApp.GetApplicationId() + " unregistered successfully. ");
                return(FinishApplicationMasterResponse.NewInstance(true));
            }
            ApplicationMasterService.AllocateResponseLock Lock = responseMap[applicationAttemptId
                                                                 ];
            if (Lock == null)
            {
                ThrowApplicationDoesNotExistInCacheException(applicationAttemptId);
            }
            // Allow only one thread in AM to do finishApp at a time.
            lock (Lock)
            {
                if (!HasApplicationMasterRegistered(applicationAttemptId))
                {
                    string message = "Application Master is trying to unregister before registering for: "
                                     + appId;
                    Log.Error(message);
                    RMAuditLogger.LogFailure(this.rmContext.GetRMApps()[appId].GetUser(), RMAuditLogger.AuditConstants
                                             .UnregisterAm, string.Empty, "ApplicationMasterService", message, appId, applicationAttemptId
                                             );
                    throw new ApplicationMasterNotRegisteredException(message);
                }
                this.amLivelinessMonitor.ReceivedPing(applicationAttemptId);
                rmContext.GetDispatcher().GetEventHandler().Handle(new RMAppAttemptUnregistrationEvent
                                                                       (applicationAttemptId, request.GetTrackingUrl(), request.GetFinalApplicationStatus
                                                                           (), request.GetDiagnostics()));
                // For UnmanagedAMs, return true so they don't retry
                return(FinishApplicationMasterResponse.NewInstance(rmApp.GetApplicationSubmissionContext
                                                                       ().GetUnmanagedAM()));
            }
        }
示例#8
0
        /// <exception cref="System.Exception"/>
        public virtual void TestFinishApplicationMasterBeforeRegistering()
        {
            MockRM rm = new MockRM(conf);

            try
            {
                rm.Start();
                // Register node1
                MockNM nm1 = rm.RegisterNode("127.0.0.1:1234", 6 * Gb);
                // Submit an application
                RMApp  app1 = rm.SubmitApp(2048);
                MockAM am1  = MockRM.LaunchAM(app1, rm, nm1);
                FinishApplicationMasterRequest req = FinishApplicationMasterRequest.NewInstance(FinalApplicationStatus
                                                                                                .Failed, string.Empty, string.Empty);
                try
                {
                    am1.UnregisterAppAttempt(req, false);
                    NUnit.Framework.Assert.Fail("ApplicationMasterNotRegisteredException should be thrown"
                                                );
                }
                catch (ApplicationMasterNotRegisteredException e)
                {
                    NUnit.Framework.Assert.IsNotNull(e);
                    NUnit.Framework.Assert.IsNotNull(e.Message);
                    NUnit.Framework.Assert.IsTrue(e.Message.Contains("Application Master is trying to unregister before registering for:"
                                                                     ));
                }
                catch (Exception)
                {
                    NUnit.Framework.Assert.Fail("ApplicationMasterNotRegisteredException should be thrown"
                                                );
                }
                am1.RegisterAppAttempt();
                am1.UnregisterAppAttempt(req, false);
                am1.WaitForState(RMAppAttemptState.Finishing);
            }
            finally
            {
                if (rm != null)
                {
                    rm.Stop();
                }
            }
        }
示例#9
0
 /// <exception cref="System.Exception"/>
 public virtual void UnregisterAppAttempt(FinishApplicationMasterRequest req, bool
                                          waitForStateRunning)
 {
     if (waitForStateRunning)
     {
         WaitForState(RMAppAttemptState.Running);
     }
     if (ugi == null)
     {
         ugi = UserGroupInformation.CreateRemoteUser(attemptId.ToString());
         Org.Apache.Hadoop.Security.Token.Token <AMRMTokenIdentifier> token = context.GetRMApps
                                                                                  ()[attemptId.GetApplicationId()].GetRMAppAttempt(attemptId).GetAMRMToken();
         ugi.AddTokenIdentifier(token.DecodeIdentifier());
     }
     try
     {
         ugi.DoAs(new _PrivilegedExceptionAction_276(this, req));
     }
     catch (UndeclaredThrowableException e)
     {
         throw (Exception)e.InnerException;
     }
 }
示例#10
0
        // Test Kill an app while the app is finishing in the meanwhile.
        /// <exception cref="System.Exception"/>
        public virtual void TestKillFinishingApp()
        {
            // this dispatcher ignores RMAppAttemptEventType.KILL event
            Dispatcher dispatcher = new _AsyncDispatcher_654();
            MockRM     rm1        = new _MockRM_677(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());
            FinishApplicationMasterRequest req = FinishApplicationMasterRequest.NewInstance(FinalApplicationStatus
                                                                                            .Succeeded, string.Empty, string.Empty);

            am1.UnregisterAppAttempt(req, true);
            rm1.WaitForState(am1.GetApplicationAttemptId(), RMAppAttemptState.Finishing);
            nm1.NodeHeartbeat(am1.GetApplicationAttemptId(), 1, ContainerState.Complete);
            rm1.WaitForState(am1.GetApplicationAttemptId(), RMAppAttemptState.Finished);
            rm1.WaitForState(app1.GetApplicationId(), RMAppState.Finished);
        }
示例#11
0
 /// <exception cref="Org.Apache.Hadoop.Yarn.Exceptions.YarnException"/>
 /// <exception cref="System.IO.IOException"/>
 public virtual FinishApplicationMasterResponse FinishApplicationMaster(FinishApplicationMasterRequest
                                                                        request)
 {
     // TODO Auto-generated method stub
     return(null);
 }
示例#12
0
        public virtual void TestTokenExpiry()
        {
            TestAMAuthorization.MyContainerManager containerManager = new TestAMAuthorization.MyContainerManager
                                                                          ();
            TestAMAuthorization.MockRMWithAMS rm = new TestAMAuthorization.MockRMWithAMS(conf
                                                                                         , containerManager);
            rm.Start();
            Configuration             conf     = rm.GetConfig();
            YarnRPC                   rpc      = YarnRPC.Create(conf);
            ApplicationMasterProtocol rmClient = null;

            try
            {
                MockNM nm1 = rm.RegisterNode("localhost:1234", 5120);
                RMApp  app = rm.SubmitApp(1024);
                nm1.NodeHeartbeat(true);
                int waitCount = 0;
                while (containerManager.containerTokens == null && waitCount++ < 20)
                {
                    Log.Info("Waiting for AM Launch to happen..");
                    Sharpen.Thread.Sleep(1000);
                }
                NUnit.Framework.Assert.IsNotNull(containerManager.containerTokens);
                RMAppAttempt         attempt = app.GetCurrentAppAttempt();
                ApplicationAttemptId applicationAttemptId = attempt.GetAppAttemptId();
                // Create a client to the RM.
                UserGroupInformation currentUser = UserGroupInformation.CreateRemoteUser(applicationAttemptId
                                                                                         .ToString());
                Credentials credentials   = containerManager.GetContainerCredentials();
                IPEndPoint  rmBindAddress = rm.GetApplicationMasterService().GetBindAddress();
                Org.Apache.Hadoop.Security.Token.Token <TokenIdentifier> amRMToken = TestAMAuthorization.MockRMWithAMS
                                                                                     .SetupAndReturnAMRMToken(rmBindAddress, credentials.GetAllTokens());
                currentUser.AddToken(amRMToken);
                rmClient = CreateRMClient(rm, conf, rpc, currentUser);
                RegisterApplicationMasterRequest request = Org.Apache.Hadoop.Yarn.Util.Records.NewRecord
                                                           <RegisterApplicationMasterRequest>();
                rmClient.RegisterApplicationMaster(request);
                FinishApplicationMasterRequest finishAMRequest = Org.Apache.Hadoop.Yarn.Util.Records
                                                                 .NewRecord <FinishApplicationMasterRequest>();
                finishAMRequest.SetFinalApplicationStatus(FinalApplicationStatus.Succeeded);
                finishAMRequest.SetDiagnostics("diagnostics");
                finishAMRequest.SetTrackingUrl("url");
                rmClient.FinishApplicationMaster(finishAMRequest);
                // Send RMAppAttemptEventType.CONTAINER_FINISHED to transit RMAppAttempt
                // from Finishing state to Finished State. Both AMRMToken and
                // ClientToAMToken will be removed.
                ContainerStatus containerStatus = BuilderUtils.NewContainerStatus(attempt.GetMasterContainer
                                                                                      ().GetId(), ContainerState.Complete, "AM Container Finished", 0);
                rm.GetRMContext().GetDispatcher().GetEventHandler().Handle(new RMAppAttemptContainerFinishedEvent
                                                                               (applicationAttemptId, containerStatus, nm1.GetNodeId()));
                // Make sure the RMAppAttempt is at Finished State.
                // Both AMRMToken and ClientToAMToken have been removed.
                int count = 0;
                while (attempt.GetState() != RMAppAttemptState.Finished && count < maxWaitAttempts
                       )
                {
                    Sharpen.Thread.Sleep(100);
                    count++;
                }
                NUnit.Framework.Assert.IsTrue(attempt.GetState() == RMAppAttemptState.Finished);
                // Now simulate trying to allocate. RPC call itself should throw auth
                // exception.
                rpc.StopProxy(rmClient, conf);
                // To avoid using cached client
                rmClient = CreateRMClient(rm, conf, rpc, currentUser);
                AllocateRequest allocateRequest = Org.Apache.Hadoop.Yarn.Util.Records.NewRecord <AllocateRequest
                                                                                                 >();
                try
                {
                    rmClient.Allocate(allocateRequest);
                    NUnit.Framework.Assert.Fail("You got to be kidding me! " + "Using App tokens after app-finish should fail!"
                                                );
                }
                catch (Exception t)
                {
                    Log.Info("Exception found is ", t);
                    // The exception will still have the earlier appAttemptId as it picks it
                    // up from the token.
                    NUnit.Framework.Assert.IsTrue(t.InnerException.Message.Contains(applicationAttemptId
                                                                                    .ToString() + " not found in AMRMTokenSecretManager."));
                }
            }
            finally
            {
                rm.Stop();
                if (rmClient != null)
                {
                    rpc.StopProxy(rmClient, conf);
                }
            }
        }
 // Expected
 // provide main method so this class can act as AM
 /// <exception cref="System.Exception"/>
 public static void Main(string[] args)
 {
     if (args[0].Equals("success"))
     {
         ApplicationMasterProtocol client = ClientRMProxy.CreateRMProxy <ApplicationMasterProtocol
                                                                         >(conf);
         client.RegisterApplicationMaster(RegisterApplicationMasterRequest.NewInstance(NetUtils
                                                                                       .GetHostname(), -1, string.Empty));
         Sharpen.Thread.Sleep(1000);
         FinishApplicationMasterResponse resp = client.FinishApplicationMaster(FinishApplicationMasterRequest
                                                                               .NewInstance(FinalApplicationStatus.Succeeded, "success", null));
         NUnit.Framework.Assert.IsTrue(resp.GetIsUnregistered());
         System.Environment.Exit(0);
     }
     else
     {
         System.Environment.Exit(1);
     }
 }
示例#14
0
 /// <exception cref="Org.Apache.Hadoop.Yarn.Exceptions.YarnException"/>
 /// <exception cref="System.IO.IOException"/>
 public virtual FinishApplicationMasterResponse FinishApplicationMaster(FinishApplicationMasterRequest
                                                                        request)
 {
     return(null);
 }
示例#15
0
 public _PrivilegedExceptionAction_276(MockAM _enclosing, FinishApplicationMasterRequest
                                       req)
 {
     this._enclosing = _enclosing;
     this.req        = req;
 }
示例#16
0
 /// <exception cref="Org.Apache.Hadoop.Yarn.Exceptions.YarnException"/>
 /// <exception cref="System.IO.IOException"/>
 public override FinishApplicationMasterResponse FinishApplicationMaster(FinishApplicationMasterRequest
                                                                         request)
 {
     this._enclosing.ResetStartFailoverFlag(true);
     // make sure failover has been triggered
     NUnit.Framework.Assert.IsTrue(this._enclosing.WaittingForFailOver());
     return(this._enclosing.CreateFakeFinishApplicationMasterResponse());
 }
示例#17
0
        protected internal virtual void DoUnregistration()
        {
            FinalApplicationStatus finishState = FinalApplicationStatus.Undefined;
            JobImpl jobImpl = (JobImpl)job;

            if (jobImpl.GetInternalState() == JobStateInternal.Succeeded)
            {
                finishState = FinalApplicationStatus.Succeeded;
            }
            else
            {
                if (jobImpl.GetInternalState() == JobStateInternal.Killed || (jobImpl.GetInternalState
                                                                                  () == JobStateInternal.Running && isSignalled))
                {
                    finishState = FinalApplicationStatus.Killed;
                }
                else
                {
                    if (jobImpl.GetInternalState() == JobStateInternal.Failed || jobImpl.GetInternalState
                            () == JobStateInternal.Error)
                    {
                        finishState = FinalApplicationStatus.Failed;
                    }
                }
            }
            StringBuilder sb = new StringBuilder();

            foreach (string s in job.GetDiagnostics())
            {
                sb.Append(s).Append("\n");
            }
            Log.Info("Setting job diagnostics to " + sb.ToString());
            string historyUrl = MRWebAppUtil.GetApplicationWebURLOnJHSWithScheme(GetConfig(),
                                                                                 context.GetApplicationID());

            Log.Info("History url is " + historyUrl);
            FinishApplicationMasterRequest request = FinishApplicationMasterRequest.NewInstance
                                                         (finishState, sb.ToString(), historyUrl);

            try
            {
                while (true)
                {
                    FinishApplicationMasterResponse response = scheduler.FinishApplicationMaster(request
                                                                                                 );
                    if (response.GetIsUnregistered())
                    {
                        // When excepting ClientService, other services are already stopped,
                        // it is safe to let clients know the final states. ClientService
                        // should wait for some time so clients have enough time to know the
                        // final states.
                        MRAppMaster.RunningAppContext raContext = (MRAppMaster.RunningAppContext)context;
                        raContext.MarkSuccessfulUnregistration();
                        break;
                    }
                    Log.Info("Waiting for application to be successfully unregistered.");
                    Sharpen.Thread.Sleep(rmPollInterval);
                }
            }
            catch (ApplicationMasterNotRegisteredException)
            {
                // RM might have restarted or failed over and so lost the fact that AM had
                // registered before.
                Register();
                DoUnregistration();
            }
        }