[REEF-1823] Support YARN API GetApplications() in .Net YarnREEFClient
This addressed the issue by
* Exposing GetApplications in IYarnRMClient
* Adding a IYarnREEFClient for Yarn specific functions
* Implementing the new functionality in IYarnREEFClient
* Updating YARNClientConfiguration to bind IYarnREEFClient to YarnREEFClient
* Continuing to bind IREEFClient also to YarnREEFClient for backward compatibility
* Adding test cases
* Updating HelloREEFYarn to use the new API
JIRA:
[REEF-1823](https://issues.apache.org/jira/browse/REEF-1823)
Pull request:
This closes #1361
diff --git a/lang/cs/Org.Apache.REEF.Client.Tests/YarnClientTests.cs b/lang/cs/Org.Apache.REEF.Client.Tests/YarnClientTests.cs
index 3858b12..127ce52 100644
--- a/lang/cs/Org.Apache.REEF.Client.Tests/YarnClientTests.cs
+++ b/lang/cs/Org.Apache.REEF.Client.Tests/YarnClientTests.cs
@@ -132,6 +132,69 @@
}
[Fact]
+ public async Task TestGetApplications()
+ {
+ var ctx = new TestContext();
+ var urlProvider = ctx.UrlProviderFake;
+ var restReqExecutor = ctx.RestRequestExecutorFake;
+ var anyUri = Enumerable.Repeat(new Uri("anyscheme://anypath"), 1);
+
+ urlProvider.GetUrlAsync().Returns(Task.FromResult(anyUri));
+ var anyApplications = new Applications();
+
+ var anyApplication1 = new Application
+ {
+ AllocatedMB = 100,
+ AmHostHttpAddress = "http://anyhttpaddress",
+ AmContainerLogs = "SomeLogs",
+ ApplicationType = "AnyYarnApplicationType",
+ State = State.FINISHED,
+ Name = "AnyApplicationName",
+ RunningContainers = 0
+ };
+
+ var anyApplication2 = new Application
+ {
+ AllocatedMB = 100,
+ AmHostHttpAddress = "http://anyhttpaddress",
+ AmContainerLogs = "SomeLogs",
+ ApplicationType = "AnyYarnApplicationType",
+ State = State.FINISHED,
+ Name = "AnyApplicationName",
+ RunningContainers = 0
+ };
+
+ anyApplications.App = new List<Application> { anyApplication1, anyApplication2 };
+
+ restReqExecutor.ExecuteAsync<Applications>(
+ Arg.Is<RestRequest>(
+ req =>
+ req.Resource == "ws/v1/cluster/apps"
+ && req.RootElement == Applications.RootElement
+ && req.Method == Method.GET),
+ anyUri.First(),
+ CancellationToken.None).Returns(Task.FromResult(anyApplications));
+
+ var yarnClient = ctx.GetClient();
+ Applications actualApplications = await yarnClient.GetApplicationsAsync();
+
+ Assert.NotEqual(actualApplications.App, null);
+ Assert.Equal(actualApplications.App.Count, 2);
+
+ int matchCount = 0;
+ foreach (var anyApplication in actualApplications.App)
+ {
+ if (anyApplication == anyApplication1 || anyApplication == anyApplication2)
+ {
+ ++matchCount;
+ }
+ }
+
+ Assert.Equal(actualApplications.App.Count, matchCount);
+ var unused = urlProvider.Received(1).GetUrlAsync();
+ }
+
+ [Fact]
public async Task TestGetApplicationFinalStatus()
{
var ctx = new TestContext();
diff --git a/lang/cs/Org.Apache.REEF.Client/Org.Apache.REEF.Client.csproj b/lang/cs/Org.Apache.REEF.Client/Org.Apache.REEF.Client.csproj
index c8df560..2c3df86 100644
--- a/lang/cs/Org.Apache.REEF.Client/Org.Apache.REEF.Client.csproj
+++ b/lang/cs/Org.Apache.REEF.Client/Org.Apache.REEF.Client.csproj
@@ -99,18 +99,21 @@
<Compile Include="Local\Parameters\LocalRuntimeDirectory.cs" />
<Compile Include="Local\Parameters\NumberOfEvaluators.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="YARN\ApplicationReport.cs" />
<Compile Include="YARN\HDI\HDInsightClientConfiguration.cs" />
<Compile Include="YARN\HDI\HDInsightCommandLineEnvironment.cs" />
<Compile Include="YARN\HDI\HDInsightCredential.cs" />
<Compile Include="YARN\HDI\HDInsightResourceFileRemoteUrlToClusterUrlConverter.cs" />
<Compile Include="YARN\HDI\HDInsightUrlProvider.cs" />
<Compile Include="YARN\HDI\NamedParameters.cs" />
+ <Compile Include="YARN\IApplicationReport.cs" />
<Compile Include="YARN\IdentityResourceFileRemoteUrlToClusterUrlConverter.cs" />
<Compile Include="YARN\IResourceFileRemoteUrlToClusterUrlConverter.cs" />
<Compile Include="YARN\IYarnCommandLineEnvironment.cs" />
<Compile Include="YARN\IYarnJobCommandProvider.cs" />
<Compile Include="YARN\IJobResourceUploader.cs" />
<Compile Include="YARN\IJobSubmissionDirectoryProvider.cs" />
+ <Compile Include="YARN\IYarnREEFClient.cs" />
<Compile Include="YARN\Parameters\DriverMaxMemoryAllicationPoolSizeMB.cs" />
<Compile Include="YARN\Parameters\DriverMaxPermSizeMB.cs" />
<Compile Include="YARN\Parameters\DriverStderrFilePath.cs" />
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/ApplicationReport.cs b/lang/cs/Org.Apache.REEF.Client/YARN/ApplicationReport.cs
new file mode 100644
index 0000000..6cbd89c
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/ApplicationReport.cs
@@ -0,0 +1,101 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+using System;
+using Org.Apache.REEF.Client.YARN.RestClient.DataModel;
+using Org.Apache.REEF.Utilities.Logging;
+
+namespace Org.Apache.REEF.Client.YARN
+{
+ /// <summary>
+ /// This class represents application information maintained by YARN RM.
+ /// This class is modeled on Org.Apache.REEF.Client.YARN.RestClient.DataModel.Application.
+ /// Documentation on the class Org.Apache.REEF.Client.YARN.RestClient.DataModel.Application
+ /// can be found here.
+ /// <a href="http://hadoop.apache.org/docs/r2.6.0/hadoop-yarn/hadoop-yarn-site/WebServicesIntro.html">
+ /// Hadoop RM REST API</a> documentation.
+ /// </summary>
+ internal sealed class ApplicationReport : IApplicationReport
+ {
+ /// <summary>
+ /// Application name.
+ /// </summary>
+ public string AppName { get; private set; }
+
+ /// <summary>
+ /// Application start time.
+ /// </summary>
+ public long StartedTime { get; private set; }
+
+ /// <summary>
+ /// Application finished time.
+ /// </summary>
+ public long FinishedTime { get; private set; }
+
+ /// <summary>
+ /// Number of running evaluators
+ /// </summary>
+ public int NumberOfRunningEvaluators { get; private set; }
+
+ /// <summary>
+ /// Driver url
+ /// </summary>
+ public Uri TrackingUrl { get; private set; }
+
+ /// <summary>
+ /// Application id
+ /// </summary>
+ public string AppId { get; private set; }
+
+ /// <summary>
+ /// Application final state
+ /// </summary>
+ public FinalState FinalState { get; private set; }
+
+ /// <summary>
+ /// Application report constructor
+ /// </summary>
+ internal ApplicationReport(string appId, string appName, string trackingUrl,
+ long startedTime, long finishedTime, int numberOfRunningEvaluators, FinalState finalState)
+ {
+ AppId = appId;
+ AppName = appName;
+ TrackingUrl = trackingUrl == null ? null : new Uri(trackingUrl);
+ FinalState = finalState;
+ StartedTime = startedTime;
+ FinishedTime = finishedTime;
+ NumberOfRunningEvaluators = numberOfRunningEvaluators;
+ }
+
+ /// <summary>
+ /// To string for printing/log
+ /// </summary>
+ /// <returns></returns>
+ public override string ToString()
+ {
+ return string.Format("AppName: {0} StartedTime: {1}, FinishedTime: {2}," +
+ "NumberOfRunningEvaluators: {3}, TrackingUrl: {4}, AppId: {5}, FinalState: {6}",
+ AppName,
+ StartedTime,
+ FinishedTime,
+ NumberOfRunningEvaluators,
+ TrackingUrl,
+ AppId,
+ FinalState);
+ }
+ }
+}
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/IApplicationReport.cs b/lang/cs/Org.Apache.REEF.Client/YARN/IApplicationReport.cs
new file mode 100644
index 0000000..66bfe14
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/IApplicationReport.cs
@@ -0,0 +1,71 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+using System;
+using Org.Apache.REEF.Client.YARN.RestClient.DataModel;
+using Org.Apache.REEF.Utilities.Attributes;
+
+namespace Org.Apache.REEF.Client.YARN
+{
+ /// <summary>
+ /// This interface represents application information maintained by YARN RM.
+ /// This interface is modeled on Org.Apache.REEF.Client.YARN.RestClient.DataModel.Application.
+ /// Documentation on the class Org.Apache.REEF.Client.YARN.RestClient.DataModel.Application
+ /// can be found here.
+ /// <a href="http://hadoop.apache.org/docs/r2.6.0/hadoop-yarn/hadoop-yarn-site/WebServicesIntro.html">
+ /// Hadoop RM REST API</a> documentation.
+ /// </summary>
+ [Unstable("0.17", "Working in progress. For local runtime, some of the property, such as FinalState and AppId are not implemented yet.")]
+ public interface IApplicationReport
+ {
+ /// <summary>
+ /// Get YARN application name.
+ /// </summary>
+ string AppName { get; }
+
+ /// <summary>
+ /// Get YARN application start time.
+ /// </summary>
+ long StartedTime { get; }
+
+ /// <summary>
+ /// Get YARN application finish time.
+ /// </summary>
+ long FinishedTime { get; }
+
+ /// <summary>
+ /// Get YARN application number of running containers.
+ /// </summary>
+ int NumberOfRunningEvaluators { get; }
+
+ /// <summary>
+ /// This method returns the url of http server running inside the driver.
+ /// e.g. http://hostname:port/
+ /// </summary>
+ Uri TrackingUrl { get; }
+
+ /// <summary>
+ /// Get YARN application id.
+ /// </summary>
+ string AppId { get; }
+
+ /// <summary>
+ /// Get Application final state.
+ /// </summary>
+ FinalState FinalState { get; }
+ }
+}
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/IYarnREEFClient.cs b/lang/cs/Org.Apache.REEF.Client/YARN/IYarnREEFClient.cs
new file mode 100644
index 0000000..e208277
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/IYarnREEFClient.cs
@@ -0,0 +1,37 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Org.Apache.REEF.Client.API;
+using Org.Apache.REEF.Utilities.Attributes;
+
+namespace Org.Apache.REEF.Client.YARN
+{
+ /// <summary>
+ /// Interface that defines Yarn client API
+ /// </summary>
+ public interface IYarnREEFClient : IREEFClient
+ {
+ /// <summary>
+ /// Returns all the application reports running in the cluster
+ /// </summary>
+ /// <returns></returns>
+ [Unstable("0.17", "Working in progress for rest API id returned")]
+ Task<IReadOnlyDictionary<string, IApplicationReport>> GetApplicationReports();
+ }
+}
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/DataModel/Application.cs b/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/DataModel/Application.cs
index db7b0c7..ff09140 100644
--- a/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/DataModel/Application.cs
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/DataModel/Application.cs
@@ -94,5 +94,38 @@
[JsonProperty("vcoreSeconds")]
public long VcoreSeconds { get; set; }
+
+ public override string ToString()
+ {
+ return string.Format("Id: {0}, User: {1}, Name: {2}, ApplicationType: {3}, " +
+ "Queue: {4}, State: {5}, FinalStatus: {6}, Progress: {7}, " +
+ "ClusterId: {8}, StartedTime: {9}, FinishedTime: {10}, " +
+ "ElapsedTime: {11}, AmContainerLogs: {12}, AmHostHttpAddress: {13}, " +
+ "AllocatedMB: {14}, AllocatedVCores: {15}, RunningContainers: {16}, " +
+ "MemorySeconds: {17}, VcoreSeconds: {18}, TrackingUI: {19}, " +
+ "TrackingUrl: {20}, Diagnostics: {21} ",
+ Id,
+ User,
+ Name,
+ ApplicationType,
+ Queue,
+ State,
+ FinalStatus,
+ Progress,
+ ClusterId,
+ StartedTime,
+ FinishedTime,
+ ElapsedTime,
+ AmContainerLogs,
+ AmHostHttpAddress,
+ AllocatedMB,
+ AllocatedVCores,
+ RunningContainers,
+ MemorySeconds,
+ VcoreSeconds,
+ TrackingUI,
+ TrackingUrl,
+ Diagnostics);
+ }
}
}
\ No newline at end of file
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/IYarnRMClient.cs b/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/IYarnRMClient.cs
index 6a69374..ee63b60 100644
--- a/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/IYarnRMClient.cs
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/IYarnRMClient.cs
@@ -37,6 +37,22 @@
Task<Application> GetApplicationAsync(string appId, CancellationToken cancellationToken);
+ /// <summary>
+ /// This API returns information about all the applications maintained
+ /// by YARN RM in the cluster by invoking REST API.
+ /// </summary>
+ /// <returns></returns>
+ Task<Applications> GetApplicationsAsync();
+
+ /// <summary>
+ /// This API returns information about all the applications maintained
+ /// by YARN RM in the cluster by invoking REST API. This API also allow cooperative
+ /// cancellation in multi-threading scenarios.
+ /// </summary>
+ /// <param name="cancellationToken"></param>
+ /// <returns></returns>
+ Task<Applications> GetApplicationsAsync(CancellationToken cancellationToken);
+
Task<NewApplication> CreateNewApplicationAsync();
Task<NewApplication> CreateNewApplicationAsync(CancellationToken cancellationToken);
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/YarnClient.cs b/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/YarnClient.cs
index ec47d8b..6a29c49 100644
--- a/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/YarnClient.cs
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/YarnClient.cs
@@ -91,6 +91,25 @@
await GenerateUrlAndExecuteRequestAsync<Application>(request, cancellationToken);
}
+ /// <summary>
+ /// This API returns information about all the applications maintained
+ /// by YARN RM in the cluster by invoking REST API. This API also allow cooperative
+ /// cancellation in multi-threading scenarios.
+ /// </summary>
+ /// <param name="cancellationToken">cancellation token</param>
+ /// <returns>list of applications</returns>
+ public async Task<Applications> GetApplicationsAsync(CancellationToken cancellationToken)
+ {
+ await new RemoveSynchronizationContextAwaiter();
+
+ var request = _requestFactory.CreateRestRequest(Applications.Resource,
+ Method.GET,
+ Applications.RootElement);
+
+ return
+ await GenerateUrlAndExecuteRequestAsync<Applications>(request, cancellationToken);
+ }
+
public async Task<NewApplication> CreateNewApplicationAsync(CancellationToken cancellationToken)
{
await new RemoveSynchronizationContextAwaiter();
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/YarnClientNoCancellationToken.cs b/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/YarnClientNoCancellationToken.cs
index 707a3a0..2d490f8 100644
--- a/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/YarnClientNoCancellationToken.cs
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/RESTClient/YarnClientNoCancellationToken.cs
@@ -24,30 +24,55 @@
{
internal sealed partial class YarnClient
{
+ /// <summary>
+ /// Get Cluster Info without cancellation token.
+ /// </summary>
public async Task<ClusterInfo> GetClusterInfoAsync()
{
await new RemoveSynchronizationContextAwaiter();
return await GetClusterInfoAsync(CancellationToken.None);
}
+ /// <summary>
+ /// Get Cluster Metrics without cancellation token.
+ /// </summary>
public async Task<ClusterMetrics> GetClusterMetricsAsync()
{
await new RemoveSynchronizationContextAwaiter();
return await GetClusterMetricsAsync(CancellationToken.None);
}
+ /// <summary>
+ /// Get Application without cancellation token.
+ /// </summary>
public async Task<Application> GetApplicationAsync(string appId)
{
await new RemoveSynchronizationContextAwaiter();
return await GetApplicationAsync(appId, CancellationToken.None);
}
+ /// <summary>
+ /// Get Applications without cancellation token.
+ /// </summary>
+ public async Task<Applications> GetApplicationsAsync()
+ {
+ await new RemoveSynchronizationContextAwaiter();
+ return await GetApplicationsAsync(CancellationToken.None);
+ }
+
+ /// <summary>
+ /// Create a new Application without cancellation token.
+ /// </summary>
public async Task<NewApplication> CreateNewApplicationAsync()
{
await new RemoveSynchronizationContextAwaiter();
return await CreateNewApplicationAsync(CancellationToken.None);
}
+ /// <summary>
+ /// Submit Application without cancellation token.
+ /// </summary>
+ /// <param name="submitApplicationRequest"></param>
public async Task<Application> SubmitApplicationAsync(SubmitApplication submitApplicationRequest)
{
await new RemoveSynchronizationContextAwaiter();
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/YARNClientConfiguration.cs b/lang/cs/Org.Apache.REEF.Client/YARN/YARNClientConfiguration.cs
index 20127c6..69d715e 100644
--- a/lang/cs/Org.Apache.REEF.Client/YARN/YARNClientConfiguration.cs
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/YARNClientConfiguration.cs
@@ -43,6 +43,7 @@
public static readonly OptionalParameter<string> FileSystemUrl = new OptionalParameter<string>();
public static ConfigurationModule ConfigurationModule = new YARNClientConfiguration()
+ .BindImplementation(GenericType<IYarnREEFClient>.Class, GenericType<YarnREEFClient>.Class)
.BindImplementation(GenericType<IREEFClient>.Class, GenericType<YarnREEFClient>.Class)
.BindImplementation(GenericType<IYarnRestClientCredential>.Class, YarnRestClientCredential)
.BindNamedParameter(GenericType<JobSubmissionDirectoryPrefixParameter>.Class, JobSubmissionFolderPrefix)
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/YARNREEFClient.cs b/lang/cs/Org.Apache.REEF.Client/YARN/YARNREEFClient.cs
index 20c8389..c00be21 100644
--- a/lang/cs/Org.Apache.REEF.Client/YARN/YARNREEFClient.cs
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/YARNREEFClient.cs
@@ -16,6 +16,8 @@
// under the License.
using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
using System.Globalization;
using System.IO;
using System.Linq;
@@ -32,7 +34,7 @@
namespace Org.Apache.REEF.Client.Yarn
{
- internal sealed class YarnREEFClient : IREEFClient
+ internal sealed class YarnREEFClient : IYarnREEFClient
{
/// <summary>
/// The class name that contains the Java counterpart for this client.
@@ -98,13 +100,50 @@
{
var application = await _yarnClient.GetApplicationAsync(appId);
- var msg = string.Format("application status {0}, Progress: {1}, trackingUri: {2}, Name: {3}, ApplicationId: {4}, State {5}.",
- application.FinalStatus, application.Progress, application.TrackingUI, application.Name, application.Id, application.State);
- Logger.Log(Level.Verbose, msg);
+ Logger.Log(Level.Verbose,
+ "application status {0}, Progress: {1}, uri: {2}, Name: {3}, ApplicationId: {4}, State {5}.",
+ application.FinalStatus,
+ application.Progress,
+ application.TrackingUI,
+ application.Name,
+ application.Id,
+ application.State);
return application.FinalStatus;
}
+ /// <summary>
+ /// Returns all the application reports running in the cluster.
+ /// GetApplicationReports call is very expensive as it is trying
+ /// fetch information about all the applications in the cluster.
+ ///
+ /// If this method is called right after submitting a new app then
+ /// that new app might not immediately result in this list until
+ /// some number of retries.
+ /// </summary>
+ /// <returns></returns>
+ public async Task<IReadOnlyDictionary<string, IApplicationReport>> GetApplicationReports()
+ {
+ var appReports = new Dictionary<string, IApplicationReport>();
+ var applications = await _yarnClient.GetApplicationsAsync();
+
+ foreach (var application in applications.App)
+ {
+ appReports.Add(application.Id, new ApplicationReport(application.Id,
+ application.Name,
+ application.TrackingUrl,
+ application.StartedTime,
+ application.FinishedTime,
+ application.RunningContainers,
+ application.FinalStatus));
+
+ Logger.Log(Level.Verbose,
+ "Application report {0}: {1}",
+ application.Id, application);
+ }
+ return new ReadOnlyDictionary<string, IApplicationReport>(appReports);
+ }
+
private void Launch(JobRequest jobRequest, string driverFolderPath)
{
_driverFolderPreparationHelper.PrepareDriverFolder(jobRequest.AppParameters, driverFolderPath);
diff --git a/lang/cs/Org.Apache.REEF.Client/YARN/YarnREEFDotNetClient.cs b/lang/cs/Org.Apache.REEF.Client/YARN/YarnREEFDotNetClient.cs
index 18f8fbf..fcae2e4 100644
--- a/lang/cs/Org.Apache.REEF.Client/YARN/YarnREEFDotNetClient.cs
+++ b/lang/cs/Org.Apache.REEF.Client/YARN/YarnREEFDotNetClient.cs
@@ -40,7 +40,7 @@
/// deprecated by final client.
/// </summary>
[Unstable("For security token support we still need to use YARNREEFClient until (REEF-875)")]
- public sealed class YarnREEFDotNetClient : IREEFClient
+ public sealed class YarnREEFDotNetClient : IYarnREEFClient
{
private const string REEFApplicationType = @"REEF";
private static readonly Logger Log = Logger.GetLogger(typeof(YarnREEFDotNetClient));
@@ -146,6 +146,17 @@
return application.FinalStatus;
}
+ /// <summary>
+ /// Returns all the application reports running in the cluster
+ /// </summary>
+ /// <returns></returns>
+ /// TODO: [REEF-1825]: Implement GetApplicationReports to return the status of the applications.
+ public async Task<IReadOnlyDictionary<string, IApplicationReport>> GetApplicationReports()
+ {
+ await Task.Delay(0);
+ throw new NotImplementedException();
+ }
+
private SubmitApplication CreateApplicationSubmissionRequest(
JobParameters jobParameters,
string appId,
diff --git a/lang/cs/Org.Apache.REEF.Examples.HelloREEF/HelloREEFYarn.cs b/lang/cs/Org.Apache.REEF.Examples.HelloREEF/HelloREEFYarn.cs
index fbccdec..6044569 100644
--- a/lang/cs/Org.Apache.REEF.Examples.HelloREEF/HelloREEFYarn.cs
+++ b/lang/cs/Org.Apache.REEF.Examples.HelloREEF/HelloREEFYarn.cs
@@ -22,6 +22,7 @@
using Org.Apache.REEF.Client.API;
using Org.Apache.REEF.Client.Common;
using Org.Apache.REEF.Client.Yarn;
+using Org.Apache.REEF.Client.YARN;
using Org.Apache.REEF.Client.YARN.RestClient.DataModel;
using Org.Apache.REEF.Driver;
using Org.Apache.REEF.Tang.Annotations;
@@ -46,7 +47,7 @@
private const string SecurityTokenId = "SecurityTokenId";
private const string SecurityTokenPwd = "SecurityTokenPwd";
- private readonly IREEFClient _reefClient;
+ private readonly IYarnREEFClient _reefClient;
private readonly JobRequestBuilder _jobRequestBuilder;
private static readonly Logger Logger = Logger.GetLogger(typeof(HelloREEFYarn));
@@ -57,7 +58,7 @@
private readonly IList<string> _nodeNames;
[Inject]
- private HelloREEFYarn(IREEFClient reefClient,
+ private HelloREEFYarn(IYarnREEFClient reefClient,
JobRequestBuilder jobRequestBuilder,
[Parameter(typeof(NodeNames))] ISet<string> nodeNames)
{
@@ -94,11 +95,26 @@
.Build();
var result = _reefClient.SubmitAndGetJobStatus(helloJobRequest);
+
+ LogApplicationReport();
var state = PullFinalJobStatus(result);
Logger.Log(Level.Info, "Application state : {0}.", state);
}
/// <summary>
+ /// Get application report and log.
+ /// </summary>
+ private void LogApplicationReport()
+ {
+ Logger.Log(Level.Info, "Getting Application report...");
+ var apps = _reefClient.GetApplicationReports().Result;
+ foreach (var r in apps)
+ {
+ Logger.Log(Level.Info, "Application report -- AppId {0}: {1}.", r.Key, r.Value.ToString());
+ }
+ }
+
+ /// <summary>
/// This is to pull job final status until the Job is done
/// </summary>
/// <param name="jobSubmitionResult"></param>