public static JobStatus FromYarn(ApplicationReport application, string jobFile) { string trackingUrl = application.GetTrackingUrl(); trackingUrl = trackingUrl == null ? string.Empty : trackingUrl; JobStatus jobStatus = new JobStatus(TypeConverter.FromYarn(application.GetApplicationId ()), 0.0f, 0.0f, 0.0f, 0.0f, TypeConverter.FromYarn(application.GetYarnApplicationState (), application.GetFinalApplicationStatus()), JobPriority.Normal, application.GetUser (), application.GetName(), application.GetQueue(), jobFile, trackingUrl, false); jobStatus.SetSchedulingInfo(trackingUrl); // Set AM tracking url jobStatus.SetStartTime(application.GetStartTime()); jobStatus.SetFinishTime(application.GetFinishTime()); jobStatus.SetFailureInfo(application.GetDiagnostics()); ApplicationResourceUsageReport resourceUsageReport = application.GetApplicationResourceUsageReport (); if (resourceUsageReport != null) { jobStatus.SetNeededMem(resourceUsageReport.GetNeededResources().GetMemory()); jobStatus.SetNumReservedSlots(resourceUsageReport.GetNumReservedContainers()); jobStatus.SetNumUsedSlots(resourceUsageReport.GetNumUsedContainers()); jobStatus.SetReservedMem(resourceUsageReport.GetReservedResources().GetMemory()); jobStatus.SetUsedMem(resourceUsageReport.GetUsedResources().GetMemory()); } return(jobStatus); }
public AppInfo(ApplicationReport app) { // JAXB needs this appId = app.GetApplicationId().ToString(); if (app.GetCurrentApplicationAttemptId() != null) { currentAppAttemptId = app.GetCurrentApplicationAttemptId().ToString(); } user = app.GetUser(); queue = app.GetQueue(); name = app.GetName(); type = app.GetApplicationType(); host = app.GetHost(); rpcPort = app.GetRpcPort(); appState = app.GetYarnApplicationState(); diagnosticsInfo = app.GetDiagnostics(); trackingUrl = app.GetTrackingUrl(); originalTrackingUrl = app.GetOriginalTrackingUrl(); submittedTime = app.GetStartTime(); startedTime = app.GetStartTime(); finishedTime = app.GetFinishTime(); elapsedTime = Times.Elapsed(startedTime, finishedTime); finalAppStatus = app.GetFinalApplicationStatus(); progress = app.GetProgress() * 100; // in percent if (app.GetApplicationTags() != null && !app.GetApplicationTags().IsEmpty()) { this.applicationTags = StringHelper.CsvJoiner.Join(app.GetApplicationTags()); } }
private void VerifyEnemyAppReport(ApplicationReport appReport) { NUnit.Framework.Assert.AreEqual("Enemy should not see app host!", Unavailable, appReport .GetHost()); NUnit.Framework.Assert.AreEqual("Enemy should not see app rpc port!", -1, appReport .GetRpcPort()); NUnit.Framework.Assert.AreEqual("Enemy should not see app client token!", null, appReport .GetClientToAMToken()); NUnit.Framework.Assert.AreEqual("Enemy should not see app diagnostics!", Unavailable , appReport.GetDiagnostics()); NUnit.Framework.Assert.AreEqual("Enemy should not see app tracking url!", Unavailable , appReport.GetTrackingUrl()); NUnit.Framework.Assert.AreEqual("Enemy should not see app original tracking url!" , Unavailable, appReport.GetOriginalTrackingUrl()); ApplicationResourceUsageReport usageReport = appReport.GetApplicationResourceUsageReport (); NUnit.Framework.Assert.AreEqual("Enemy should not see app used containers", -1, usageReport .GetNumUsedContainers()); NUnit.Framework.Assert.AreEqual("Enemy should not see app reserved containers", - 1, usageReport.GetNumReservedContainers()); NUnit.Framework.Assert.AreEqual("Enemy should not see app used resources", -1, usageReport .GetUsedResources().GetMemory()); NUnit.Framework.Assert.AreEqual("Enemy should not see app reserved resources", -1 , usageReport.GetReservedResources().GetMemory()); NUnit.Framework.Assert.AreEqual("Enemy should not see app needed resources", -1, usageReport.GetNeededResources().GetMemory()); }
/// <exception cref="System.IO.IOException"/> public virtual GetJobReportResponse GetJobReport(GetJobReportRequest request) { JobReport jobReport = recordFactory.NewRecordInstance <JobReport>(); jobReport.SetJobId(request.GetJobId()); jobReport.SetJobState(jobState); jobReport.SetUser(applicationReport.GetUser()); jobReport.SetStartTime(applicationReport.GetStartTime()); jobReport.SetDiagnostics(applicationReport.GetDiagnostics()); jobReport.SetJobName(applicationReport.GetName()); jobReport.SetTrackingUrl(applicationReport.GetTrackingUrl()); jobReport.SetFinishTime(applicationReport.GetFinishTime()); GetJobReportResponse resp = recordFactory.NewRecordInstance <GetJobReportResponse> (); resp.SetJobReport(jobReport); return(resp); }
/// <summary>Monitor the submitted application for completion.</summary> /// <remarks> /// Monitor the submitted application for completion. Kill application if time /// expires. /// </remarks> /// <param name="appId">Application Id of application to be monitored</param> /// <returns>true if application completed successfully</returns> /// <exception cref="Org.Apache.Hadoop.Yarn.Exceptions.YarnException"/> /// <exception cref="System.IO.IOException"/> private ApplicationReport MonitorApplication(ApplicationId appId, ICollection <YarnApplicationState > finalState) { long foundAMCompletedTime = 0; StringBuilder expectedFinalState = new StringBuilder(); bool first = true; foreach (YarnApplicationState state in finalState) { if (first) { first = false; expectedFinalState.Append(state.ToString()); } else { expectedFinalState.Append("," + state.ToString()); } } while (true) { // Check app status every 1 second. try { Sharpen.Thread.Sleep(1000); } catch (Exception) { Log.Debug("Thread sleep in monitoring loop interrupted"); } // Get application report for the appId we are interested in ApplicationReport report = rmClient.GetApplicationReport(appId); Log.Info("Got application report from ASM for" + ", appId=" + appId.GetId() + ", appAttemptId=" + report.GetCurrentApplicationAttemptId() + ", clientToAMToken=" + report.GetClientToAMToken () + ", appDiagnostics=" + report.GetDiagnostics() + ", appMasterHost=" + report .GetHost() + ", appQueue=" + report.GetQueue() + ", appMasterRpcPort=" + report. GetRpcPort() + ", appStartTime=" + report.GetStartTime() + ", yarnAppState=" + report .GetYarnApplicationState().ToString() + ", distributedFinalState=" + report.GetFinalApplicationStatus ().ToString() + ", appTrackingUrl=" + report.GetTrackingUrl() + ", appUser="******"Waited " + AmStateWaitTimeoutMs / 1000 + " seconds after process completed for AppReport" + " to reach desired final state. Not waiting anymore." + "CurrentState = " + state_1 + ", ExpectedStates = " + expectedFinalState.ToString()); throw new RuntimeException("Failed to receive final expected state" + " in ApplicationReport" + ", CurrentState=" + state_1 + ", ExpectedStates=" + expectedFinalState.ToString ()); } } } } }
public virtual void TestFromYarnApplicationReport() { ApplicationId mockAppId = Org.Mockito.Mockito.Mock <ApplicationId>(); Org.Mockito.Mockito.When(mockAppId.GetClusterTimestamp()).ThenReturn(12345L); Org.Mockito.Mockito.When(mockAppId.GetId()).ThenReturn(6789); ApplicationReport mockReport = Org.Mockito.Mockito.Mock <ApplicationReport>(); Org.Mockito.Mockito.When(mockReport.GetTrackingUrl()).ThenReturn("dummy-tracking-url" ); Org.Mockito.Mockito.When(mockReport.GetApplicationId()).ThenReturn(mockAppId); Org.Mockito.Mockito.When(mockReport.GetYarnApplicationState()).ThenReturn(YarnApplicationState .Killed); Org.Mockito.Mockito.When(mockReport.GetUser()).ThenReturn("dummy-user"); Org.Mockito.Mockito.When(mockReport.GetQueue()).ThenReturn("dummy-queue"); string jobFile = "dummy-path/job.xml"; try { JobStatus status = TypeConverter.FromYarn(mockReport, jobFile); } catch (ArgumentNullException) { NUnit.Framework.Assert.Fail("Type converstion from YARN fails for jobs without " + "ApplicationUsageReport"); } ApplicationResourceUsageReport appUsageRpt = Org.Apache.Hadoop.Yarn.Util.Records. NewRecord <ApplicationResourceUsageReport>(); Resource r = Org.Apache.Hadoop.Yarn.Util.Records.NewRecord <Resource>(); r.SetMemory(2048); appUsageRpt.SetNeededResources(r); appUsageRpt.SetNumReservedContainers(1); appUsageRpt.SetNumUsedContainers(3); appUsageRpt.SetReservedResources(r); appUsageRpt.SetUsedResources(r); Org.Mockito.Mockito.When(mockReport.GetApplicationResourceUsageReport()).ThenReturn (appUsageRpt); JobStatus status_1 = TypeConverter.FromYarn(mockReport, jobFile); NUnit.Framework.Assert.IsNotNull("fromYarn returned null status", status_1); NUnit.Framework.Assert.AreEqual("jobFile set incorrectly", "dummy-path/job.xml", status_1.GetJobFile()); NUnit.Framework.Assert.AreEqual("queue set incorrectly", "dummy-queue", status_1. GetQueue()); NUnit.Framework.Assert.AreEqual("trackingUrl set incorrectly", "dummy-tracking-url" , status_1.GetTrackingUrl()); NUnit.Framework.Assert.AreEqual("user set incorrectly", "dummy-user", status_1.GetUsername ()); NUnit.Framework.Assert.AreEqual("schedulingInfo set incorrectly", "dummy-tracking-url" , status_1.GetSchedulingInfo()); NUnit.Framework.Assert.AreEqual("jobId set incorrectly", 6789, status_1.GetJobID( ).GetId()); NUnit.Framework.Assert.AreEqual("state set incorrectly", JobStatus.State.Killed, status_1.GetState()); NUnit.Framework.Assert.AreEqual("needed mem info set incorrectly", 2048, status_1 .GetNeededMem()); NUnit.Framework.Assert.AreEqual("num rsvd slots info set incorrectly", 1, status_1 .GetNumReservedSlots()); NUnit.Framework.Assert.AreEqual("num used slots info set incorrectly", 3, status_1 .GetNumUsedSlots()); NUnit.Framework.Assert.AreEqual("rsvd mem info set incorrectly", 2048, status_1.GetReservedMem ()); NUnit.Framework.Assert.AreEqual("used mem info set incorrectly", 2048, status_1.GetUsedMem ()); }
/// <exception cref="System.IO.IOException"/> private MRClientProtocol GetProxy() { if (realProxy != null) { return(realProxy); } // Possibly allow nulls through the PB tunnel, otherwise deal with an exception // and redirect to the history server. ApplicationReport application = null; try { application = rm.GetApplicationReport(appId); } catch (ApplicationNotFoundException) { application = null; } catch (YarnException e2) { throw new IOException(e2); } if (application != null) { trackingUrl = application.GetTrackingUrl(); } IPEndPoint serviceAddr = null; while (application == null || YarnApplicationState.Running == application.GetYarnApplicationState ()) { if (application == null) { Log.Info("Could not get Job info from RM for job " + jobId + ". Redirecting to job history server." ); return(CheckAndGetHSProxy(null, JobState.New)); } try { if (application.GetHost() == null || string.Empty.Equals(application.GetHost())) { Log.Debug("AM not assigned to Job. Waiting to get the AM ..."); Sharpen.Thread.Sleep(2000); Log.Debug("Application state is " + application.GetYarnApplicationState()); application = rm.GetApplicationReport(appId); continue; } else { if (Unavailable.Equals(application.GetHost())) { if (!amAclDisabledStatusLogged) { Log.Info("Job " + jobId + " is running, but the host is unknown." + " Verify user has VIEW_JOB access." ); amAclDisabledStatusLogged = true; } return(GetNotRunningJob(application, JobState.Running)); } } if (!conf.GetBoolean(MRJobConfig.JobAmAccessDisabled, false)) { UserGroupInformation newUgi = UserGroupInformation.CreateRemoteUser(UserGroupInformation .GetCurrentUser().GetUserName()); serviceAddr = NetUtils.CreateSocketAddrForHost(application.GetHost(), application .GetRpcPort()); if (UserGroupInformation.IsSecurityEnabled()) { Token clientToAMToken = application.GetClientToAMToken(); Org.Apache.Hadoop.Security.Token.Token <ClientToAMTokenIdentifier> token = ConverterUtils .ConvertFromYarn(clientToAMToken, serviceAddr); newUgi.AddToken(token); } Log.Debug("Connecting to " + serviceAddr); IPEndPoint finalServiceAddr = serviceAddr; realProxy = newUgi.DoAs(new _PrivilegedExceptionAction_202(this, finalServiceAddr )); } else { if (!amAclDisabledStatusLogged) { Log.Info("Network ACL closed to AM for job " + jobId + ". Not going to try to reach the AM." ); amAclDisabledStatusLogged = true; } return(GetNotRunningJob(null, JobState.Running)); } return(realProxy); } catch (IOException) { //possibly the AM has crashed //there may be some time before AM is restarted //keep retrying by getting the address from RM Log.Info("Could not connect to " + serviceAddr + ". Waiting for getting the latest AM address..." ); try { Sharpen.Thread.Sleep(2000); } catch (Exception e1) { Log.Warn("getProxy() call interruped", e1); throw new YarnRuntimeException(e1); } try { application = rm.GetApplicationReport(appId); } catch (YarnException e1) { throw new IOException(e1); } if (application == null) { Log.Info("Could not get Job info from RM for job " + jobId + ". Redirecting to job history server." ); return(CheckAndGetHSProxy(null, JobState.Running)); } } catch (Exception e) { Log.Warn("getProxy() call interruped", e); throw new YarnRuntimeException(e); } catch (YarnException e) { throw new IOException(e); } } string user = application.GetUser(); if (user == null) { throw new IOException("User is not set in the application report"); } if (application.GetYarnApplicationState() == YarnApplicationState.New || application .GetYarnApplicationState() == YarnApplicationState.NewSaving || application.GetYarnApplicationState () == YarnApplicationState.Submitted || application.GetYarnApplicationState() == YarnApplicationState.Accepted) { realProxy = null; return(GetNotRunningJob(application, JobState.New)); } if (application.GetYarnApplicationState() == YarnApplicationState.Failed) { realProxy = null; return(GetNotRunningJob(application, JobState.Failed)); } if (application.GetYarnApplicationState() == YarnApplicationState.Killed) { realProxy = null; return(GetNotRunningJob(application, JobState.Killed)); } //History server can serve a job only if application //succeeded. if (application.GetYarnApplicationState() == YarnApplicationState.Finished) { Log.Info("Application state is completed. FinalApplicationStatus=" + application. GetFinalApplicationStatus().ToString() + ". Redirecting to job history server"); realProxy = CheckAndGetHSProxy(application, JobState.Succeeded); } return(realProxy); }
/// <summary>Monitor the submitted application for completion.</summary> /// <remarks> /// Monitor the submitted application for completion. /// Kill application if time expires. /// </remarks> /// <param name="appId">Application Id of application to be monitored</param> /// <returns>true if application completed successfully</returns> /// <exception cref="Org.Apache.Hadoop.Yarn.Exceptions.YarnException"/> /// <exception cref="System.IO.IOException"/> private bool MonitorApplication(ApplicationId appId) { while (true) { // Check app status every 1 second. try { Sharpen.Thread.Sleep(1000); } catch (Exception) { Log.Debug("Thread sleep in monitoring loop interrupted"); } // Get application report for the appId we are interested in ApplicationReport report = yarnClient.GetApplicationReport(appId); Log.Info("Got application report from ASM for" + ", appId=" + appId.GetId() + ", clientToAMToken=" + report.GetClientToAMToken() + ", appDiagnostics=" + report.GetDiagnostics() + ", appMasterHost=" + report.GetHost() + ", appQueue=" + report.GetQueue() + ", appMasterRpcPort=" + report.GetRpcPort() + ", appStartTime=" + report.GetStartTime() + ", yarnAppState=" + report.GetYarnApplicationState().ToString() + ", distributedFinalState=" + report .GetFinalApplicationStatus().ToString() + ", appTrackingUrl=" + report.GetTrackingUrl () + ", appUser="******"Application has completed successfully. Breaking monitoring loop"); return(true); } else { Log.Info("Application did finished unsuccessfully." + " YarnState=" + state.ToString () + ", DSFinalStatus=" + dsStatus.ToString() + ". Breaking monitoring loop"); return(false); } } else { if (YarnApplicationState.Killed == state || YarnApplicationState.Failed == state) { Log.Info("Application did not finish." + " YarnState=" + state.ToString() + ", DSFinalStatus=" + dsStatus.ToString() + ". Breaking monitoring loop"); return(false); } } if (Runtime.CurrentTimeMillis() > (clientStartTime + clientTimeout)) { Log.Info("Reached client specified timeout for application. Killing application"); ForceKillApplication(appId); return(false); } } }