Repository: incubator-reef
Updated Branches:
refs/heads/master f2cd5975d -> d5cbc52d2
[REEF-638] Passing Mapper Specific configuration in IMRU
This addressed the issue by
* introducing interface IPerMapperConfigs that allowes user to
specify a list of configurations, one for each mapper.
* making appropriate changes in IMRUDriver, IMRUClient, JobDefinition
and JobDefinitionBuilder
JIRA:
[REEF-638](https://issues.apache.org/jira/browse/REEF-638)
Pull Request:
This closes #417
Project: http://git-wip-us.apache.org/repos/asf/incubator-reef/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-reef/commit/d5cbc52d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-reef/tree/d5cbc52d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-reef/diff/d5cbc52d
Branch: refs/heads/master
Commit: d5cbc52d20026b087729887523e9056533dde7eb
Parents: f2cd597
Author: Dhruv <[email protected]>
Authored: Tue Aug 25 23:28:54 2015 -0700
Committer: Markus Weimer <[email protected]>
Committed: Fri Sep 4 14:36:27 2015 -0700
----------------------------------------------------------------------
.../API/IMRUJobDefinition.cs | 13 ++++++
.../API/IMRUJobDefinitionBuilder.cs | 18 ++++++++
...IMRUPerMapperConfigGeneratorConfiguration.cs | 45 ++++++++++++++++++++
.../API/IPerMapperConfigGenerator.cs | 35 +++++++++++++++
.../API/PerMapConfigGeneratorSet.cs | 31 ++++++++++++++
.../OnREEF/Client/REEFIMRUClient.cs | 22 +++++++++-
.../OnREEF/Driver/IMRUDriver.cs | 26 ++++++++++-
.../Org.Apache.REEF.IMRU.csproj | 3 ++
8 files changed, 191 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/d5cbc52d/lang/cs/Org.Apache.REEF.IMRU/API/IMRUJobDefinition.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.IMRU/API/IMRUJobDefinition.cs
b/lang/cs/Org.Apache.REEF.IMRU/API/IMRUJobDefinition.cs
index ed8c211..1d42711 100644
--- a/lang/cs/Org.Apache.REEF.IMRU/API/IMRUJobDefinition.cs
+++ b/lang/cs/Org.Apache.REEF.IMRU/API/IMRUJobDefinition.cs
@@ -17,6 +17,7 @@
* under the License.
*/
+using System.Collections.Generic;
using Org.Apache.REEF.Tang.Interface;
namespace Org.Apache.REEF.IMRU.API
@@ -39,6 +40,7 @@ namespace Org.Apache.REEF.IMRU.API
private readonly int _numberOfMappers;
private readonly int _memoryPerMapper;
private readonly int _updateTaskMemory;
+ private readonly ISet<IConfiguration> _perMapConfigGeneratorConfig;
/// <summary>
/// Constructor
@@ -55,6 +57,7 @@ namespace Org.Apache.REEF.IMRU.API
/// PipelineDataConverter for TMapInput</param>
/// <param name="partitionedDatasetConfiguration">Configuration of
partitioned
/// dataset</param>
+ /// <param name="perMapConfigGeneratorConfig">Per mapper
configuration</param>
/// <param name="numberOfMappers">Number of mappers</param>
/// <param name="memoryPerMapper">Per Mapper memory.</param>
/// <param name="jobName">Job name</param>
@@ -67,6 +70,7 @@ namespace Org.Apache.REEF.IMRU.API
IConfiguration mapOutputPipelineDataConverterConfiguration,
IConfiguration mapInputPipelineDataConverterConfiguration,
IConfiguration partitionedDatasetConfiguration,
+ ISet<IConfiguration> perMapConfigGeneratorConfig,
int numberOfMappers,
int memoryPerMapper,
int updateTaskMemory,
@@ -84,6 +88,7 @@ namespace Org.Apache.REEF.IMRU.API
_jobName = jobName;
_memoryPerMapper = memoryPerMapper;
_updateTaskMemory = updateTaskMemory;
+ _perMapConfigGeneratorConfig = perMapConfigGeneratorConfig;
}
/// <summary>
@@ -184,5 +189,13 @@ namespace Org.Apache.REEF.IMRU.API
{
get { return _updateTaskMemory; }
}
+
+ /// <summary>
+ /// Per mapper configuration
+ /// </summary>
+ internal ISet<IConfiguration> PerMapConfigGeneratorConfig
+ {
+ get { return _perMapConfigGeneratorConfig; }
+ }
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/d5cbc52d/lang/cs/Org.Apache.REEF.IMRU/API/IMRUJobDefinitionBuilder.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.IMRU/API/IMRUJobDefinitionBuilder.cs
b/lang/cs/Org.Apache.REEF.IMRU/API/IMRUJobDefinitionBuilder.cs
index 730fb54..985c372 100644
--- a/lang/cs/Org.Apache.REEF.IMRU/API/IMRUJobDefinitionBuilder.cs
+++ b/lang/cs/Org.Apache.REEF.IMRU/API/IMRUJobDefinitionBuilder.cs
@@ -18,9 +18,13 @@
*/
using System;
+using System.Collections.Generic;
+using Org.Apache.REEF.IMRU.OnREEF.Parameters;
using Org.Apache.REEF.Network.Group.Driver.Impl;
+using Org.Apache.REEF.Tang.Formats;
using Org.Apache.REEF.Tang.Interface;
using Org.Apache.REEF.Tang.Implementations.Tang;
+using Org.Apache.REEF.Tang.Util;
using Org.Apache.REEF.Utilities.Diagnostics;
using Org.Apache.REEF.Utilities.Logging;
@@ -46,6 +50,7 @@ namespace Org.Apache.REEF.IMRU.API
private IConfiguration _mapOutputPipelineDataConverterConfiguration;
private IConfiguration _mapInputPipelineDataConverterConfiguration;
private IConfiguration _partitionedDatasetConfiguration;
+ private readonly ISet<IConfiguration> _perMapConfigGeneratorConfig;
private static readonly IConfiguration EmptyConfiguration =
TangFactory.GetTang().NewConfigurationBuilder().Build();
@@ -60,6 +65,7 @@ namespace Org.Apache.REEF.IMRU.API
_partitionedDatasetConfiguration = EmptyConfiguration;
_memoryPerMapper = 512;
_updateTaskMemory = 512;
+ _perMapConfigGeneratorConfig = new HashSet<IConfiguration>();
}
/// <summary>
@@ -203,6 +209,17 @@ namespace Org.Apache.REEF.IMRU.API
}
/// <summary>
+ /// Sets Per Map Configuration
+ /// </summary>
+ /// <param name="perMapperConfig">Mapper configs</param>
+ /// <returns></returns>
+ public IMRUJobDefinitionBuilder SetPerMapConfigurations(IConfiguration
perMapperConfig)
+ {
+ _perMapConfigGeneratorConfig.Add(perMapperConfig);
+ return this;
+ }
+
+ /// <summary>
/// Instantiate the IMRUJobDefinition.
/// </summary>
/// <returns>The IMRUJobDefintion configured.</returns>
@@ -250,6 +267,7 @@ namespace Org.Apache.REEF.IMRU.API
_mapOutputPipelineDataConverterConfiguration,
_mapInputPipelineDataConverterConfiguration,
_partitionedDatasetConfiguration,
+ _perMapConfigGeneratorConfig,
_numberOfMappers,
_memoryPerMapper,
_updateTaskMemory,
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/d5cbc52d/lang/cs/Org.Apache.REEF.IMRU/API/IMRUPerMapperConfigGeneratorConfiguration.cs
----------------------------------------------------------------------
diff --git
a/lang/cs/Org.Apache.REEF.IMRU/API/IMRUPerMapperConfigGeneratorConfiguration.cs
b/lang/cs/Org.Apache.REEF.IMRU/API/IMRUPerMapperConfigGeneratorConfiguration.cs
new file mode 100644
index 0000000..b8a85bc
--- /dev/null
+++
b/lang/cs/Org.Apache.REEF.IMRU/API/IMRUPerMapperConfigGeneratorConfiguration.cs
@@ -0,0 +1,45 @@
+/**
+ * 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 Org.Apache.REEF.IMRU.OnREEF.Parameters;
+using Org.Apache.REEF.Tang.Formats;
+using Org.Apache.REEF.Tang.Util;
+
+namespace Org.Apache.REEF.IMRU.API
+{
+ /// <summary>
+ /// A configuration module for per mapper configuration.
+ /// </summary>
+ public sealed class IMRUPerMapperConfigGeneratorConfiguration :
ConfigurationModuleBuilder
+ {
+ /// <summary>
+ /// The IPerMapperConfigs to use.
+ /// </summary>
+ public static readonly RequiredImpl<IPerMapperConfigGenerator>
PerMapperConfigGenerator =
+ new RequiredImpl<IPerMapperConfigGenerator>();
+
+ /// <summary>
+ /// Configuration module
+ /// </summary>
+ public static ConfigurationModule ConfigurationModule =
+ new IMRUPerMapperConfigGeneratorConfiguration()
+ .BindSetEntry(GenericType<PerMapConfigGeneratorSet>.Class,
PerMapperConfigGenerator)
+ .Build();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/d5cbc52d/lang/cs/Org.Apache.REEF.IMRU/API/IPerMapperConfigGenerator.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.IMRU/API/IPerMapperConfigGenerator.cs
b/lang/cs/Org.Apache.REEF.IMRU/API/IPerMapperConfigGenerator.cs
new file mode 100644
index 0000000..cf902a6
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.IMRU/API/IPerMapperConfigGenerator.cs
@@ -0,0 +1,35 @@
+// 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 Org.Apache.REEF.Tang.Interface;
+
+namespace Org.Apache.REEF.IMRU.API
+{
+ /// <summary>
+ /// Class returning mapper specific configuration
+ /// </summary>
+ public interface IPerMapperConfigGenerator
+ {
+ /// <summary>
+ /// returns per mapper configuration
+ /// </summary>
+ /// <param name="currentPartitionNumber">current partition
number</param>
+ /// <param name="totalMappers">total number of mappers</param>
+ /// <returns>mapper configuration</returns>
+ IConfiguration GetMapperConfiguration(int currentPartitionNumber, int
totalMappers);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/d5cbc52d/lang/cs/Org.Apache.REEF.IMRU/API/PerMapConfigGeneratorSet.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.IMRU/API/PerMapConfigGeneratorSet.cs
b/lang/cs/Org.Apache.REEF.IMRU/API/PerMapConfigGeneratorSet.cs
new file mode 100644
index 0000000..064a647
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.IMRU/API/PerMapConfigGeneratorSet.cs
@@ -0,0 +1,31 @@
+#region LICENSE
+
+// 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.
+
+#endregion
+
+using System.Collections.Generic;
+using Org.Apache.REEF.Tang.Annotations;
+
+namespace Org.Apache.REEF.IMRU.API
+{
+ [NamedParameter("Set of mapper specfic configuration generators",
"setofmapconfig")]
+ internal sealed class PerMapConfigGeneratorSet :
Name<ISet<IPerMapperConfigGenerator>>
+ {
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/d5cbc52d/lang/cs/Org.Apache.REEF.IMRU/OnREEF/Client/REEFIMRUClient.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.IMRU/OnREEF/Client/REEFIMRUClient.cs
b/lang/cs/Org.Apache.REEF.IMRU/OnREEF/Client/REEFIMRUClient.cs
index 9466086..752aa42 100644
--- a/lang/cs/Org.Apache.REEF.IMRU/OnREEF/Client/REEFIMRUClient.cs
+++ b/lang/cs/Org.Apache.REEF.IMRU/OnREEF/Client/REEFIMRUClient.cs
@@ -15,8 +15,11 @@
// specific language governing permissions and limitations
// under the License.
+using System;
using System.Collections.Generic;
+using System.Data;
using System.Globalization;
+using System.Linq;
using Org.Apache.REEF.Client.API;
using Org.Apache.REEF.Driver;
using Org.Apache.REEF.IMRU.API;
@@ -27,8 +30,12 @@ using Org.Apache.REEF.Network.Group.Driver;
using Org.Apache.REEF.Network.Group.Driver.Impl;
using Org.Apache.REEF.Tang.Annotations;
using Org.Apache.REEF.Tang.Formats;
+using Org.Apache.REEF.Tang.Implementations.Configuration;
using Org.Apache.REEF.Tang.Implementations.Tang;
+using Org.Apache.REEF.Tang.Interface;
using Org.Apache.REEF.Tang.Util;
+using Org.Apache.REEF.Utilities.Diagnostics;
+using Org.Apache.REEF.Utilities.Logging;
namespace Org.Apache.REEF.IMRU.OnREEF.Client
{
@@ -40,6 +47,8 @@ namespace Org.Apache.REEF.IMRU.OnREEF.Client
/// <typeparam name="TResult">The return type of the
computation.</typeparam>
internal sealed class REEFIMRUClient<TMapInput, TMapOutput, TResult> :
IIMRUClient<TMapInput, TMapOutput, TResult>
{
+ private static readonly Logger Logger =
Logger.GetLogger(typeof(IMRUDriver<TMapInput, TMapOutput, TResult>));
+
private readonly IREEFClient _reefClient;
private readonly JobSubmissionBuilderFactory
_jobSubmissionBuilderFactory;
private readonly AvroConfigurationSerializer _configurationSerializer;
@@ -61,6 +70,16 @@ namespace Org.Apache.REEF.IMRU.OnREEF.Client
IEnumerable<TResult> IIMRUClient<TMapInput, TMapOutput,
TResult>.Submit(IMRUJobDefinition jobDefinition)
{
string driverId = string.Format("IMRU-{0}-Driver",
jobDefinition.JobName);
+ IConfiguration overallPerMapConfig = null;
+
+ try
+ {
+ overallPerMapConfig =
Configurations.Merge(jobDefinition.PerMapConfigGeneratorConfig.ToArray());
+ }
+ catch (Exception e)
+ {
+ Exceptions.Throw(e, "Issues in merging PerMapCOnfigGenerator
configurations", Logger);
+ }
// The driver configuration contains all the needed bindings.
var imruDriverConfiguration =
TangFactory.GetTang().NewConfigurationBuilder(new[]
@@ -86,7 +105,8 @@ namespace Org.Apache.REEF.IMRU.OnREEF.Client
(jobDefinition.NumberOfMappers +
1).ToString(CultureInfo.InvariantCulture))
.BindImplementation(GenericType<IGroupCommDriver>.Class,
GenericType<GroupCommDriver>.Class)
.Build(),
- jobDefinition.PartitionedDatasetConfiguration
+ jobDefinition.PartitionedDatasetConfiguration,
+ overallPerMapConfig
})
.BindNamedParameter(typeof (SerializedMapConfiguration),
_configurationSerializer.ToString(jobDefinition.MapFunctionConfiguration))
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/d5cbc52d/lang/cs/Org.Apache.REEF.IMRU/OnREEF/Driver/IMRUDriver.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.IMRU/OnREEF/Driver/IMRUDriver.cs
b/lang/cs/Org.Apache.REEF.IMRU/OnREEF/Driver/IMRUDriver.cs
index 0655835..452298c 100644
--- a/lang/cs/Org.Apache.REEF.IMRU/OnREEF/Driver/IMRUDriver.cs
+++ b/lang/cs/Org.Apache.REEF.IMRU/OnREEF/Driver/IMRUDriver.cs
@@ -17,12 +17,15 @@
using System;
using System.Collections.Concurrent;
+using System.Collections.Generic;
using System.Globalization;
+using System.Linq;
using Org.Apache.REEF.Common.Tasks;
using Org.Apache.REEF.Driver;
using Org.Apache.REEF.Driver.Context;
using Org.Apache.REEF.Driver.Evaluator;
using Org.Apache.REEF.Driver.Task;
+using Org.Apache.REEF.IMRU.API;
using Org.Apache.REEF.IMRU.OnREEF.IMRUTasks;
using Org.Apache.REEF.IMRU.OnREEF.MapInputWithControlMessage;
using Org.Apache.REEF.IMRU.OnREEF.Parameters;
@@ -62,16 +65,19 @@ namespace Org.Apache.REEF.IMRU.OnREEF.Driver
private readonly TaskStarter _groupCommTaskStarter;
private IConfiguration _tcpPortProviderConfig;
private readonly ConcurrentStack<string> _taskIdStack;
+ private readonly ConcurrentStack<IConfiguration>
_perMapperConfiguration;
private readonly ConcurrentStack<IPartitionDescriptor>
_partitionDescriptorStack;
private readonly int _coresPerMapper;
private readonly int _coresForUpdateTask;
private readonly int _memoryPerMapper;
private readonly int _memoryForUpdateTask;
+ private readonly ISet<IPerMapperConfigGenerator> _perMapperConfigs;
private bool _allocatedUpdateTaskEvaluator;
private readonly ConcurrentBag<ICompletedTask> _completedTasks;
[Inject]
private IMRUDriver(IPartitionedDataSet dataSet,
+ [Parameter(typeof(PerMapConfigGeneratorSet))]
ISet<IPerMapperConfigGenerator> perMapperConfigs,
ConfigurationManager configurationManager,
IEvaluatorRequestor evaluatorRequestor,
[Parameter(typeof (TcpPortRangeStart))] int startingPort,
@@ -90,6 +96,7 @@ namespace Org.Apache.REEF.IMRU.OnREEF.Driver
_coresForUpdateTask = coresForUpdateTask;
_memoryPerMapper = memoryPerMapper;
_memoryForUpdateTask = memoryForUpdateTask;
+ _perMapperConfigs = perMapperConfigs;
_allocatedUpdateTaskEvaluator = false;
_completedTasks = new ConcurrentBag<ICompletedTask>();
@@ -103,6 +110,7 @@ namespace Org.Apache.REEF.IMRU.OnREEF.Driver
_groupCommTaskStarter = new TaskStarter(_groupCommDriver,
_dataSet.Count + 1);
_taskIdStack = new ConcurrentStack<string>();
+ _perMapperConfiguration = new ConcurrentStack<IConfiguration>();
_partitionDescriptorStack = new
ConcurrentStack<IPartitionDescriptor>();
ConstructTaskIdAndPartitionDescriptorStack();
}
@@ -231,6 +239,17 @@ namespace Org.Apache.REEF.IMRU.OnREEF.Driver
return;
}
+ IConfiguration mapSpecificConfig;
+
+ if (!_perMapperConfiguration.TryPop(out mapSpecificConfig))
+ {
+ Logger.Log(Level.Warning,
+ "No per map configuration exist for the active context
{0}. Disposing the context.",
+ activeContext.Id);
+ activeContext.Dispose();
+ return;
+ }
+
var partialTaskConf =
TangFactory.GetTang()
.NewConfigurationBuilder(new[]
@@ -239,7 +258,8 @@ namespace Org.Apache.REEF.IMRU.OnREEF.Driver
.Set(TaskConfiguration.Identifier, taskId)
.Set(TaskConfiguration.Task,
GenericType<MapTaskHost<TMapInput, TMapOutput>>.Class)
.Build(),
- _configurationManager.MapFunctionConfiguration
+ _configurationManager.MapFunctionConfiguration,
+ mapSpecificConfig
})
.Build();
@@ -365,6 +385,10 @@ namespace Org.Apache.REEF.IMRU.OnREEF.Driver
string id = IMRUConstants.MapTaskPrefix + "-Id" + counter +
"-Version0";
_taskIdStack.Push(id);
_partitionDescriptorStack.Push(partitionDescriptor);
+
+ var emptyConfig =
TangFactory.GetTang().NewConfigurationBuilder().Build();
+ IConfiguration config =
_perMapperConfigs.Aggregate(emptyConfig, (current, configGenerator) =>
Configurations.Merge(current, configGenerator.GetMapperConfiguration(counter,
_dataSet.Count)));
+ _perMapperConfiguration.Push(config);
counter++;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/d5cbc52d/lang/cs/Org.Apache.REEF.IMRU/Org.Apache.REEF.IMRU.csproj
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.IMRU/Org.Apache.REEF.IMRU.csproj
b/lang/cs/Org.Apache.REEF.IMRU/Org.Apache.REEF.IMRU.csproj
index b47aff7..e3fecf9 100644
--- a/lang/cs/Org.Apache.REEF.IMRU/Org.Apache.REEF.IMRU.csproj
+++ b/lang/cs/Org.Apache.REEF.IMRU/Org.Apache.REEF.IMRU.csproj
@@ -49,8 +49,11 @@ under the License.
<Compile Include="API\IMRUJobDefinitionBuilder.cs" />
<Compile Include="API\IMRUMapConfiguration.cs" />
<Compile Include="API\IMRUReduceFunctionConfiguration.cs" />
+ <Compile Include="API\IMRUPerMapperConfigGeneratorConfiguration.cs" />
<Compile Include="API\IMRUUpdateConfiguration.cs" />
<Compile Include="API\IUpdateFunction.cs" />
+ <Compile Include="API\IPerMapperConfigGenerator.cs" />
+ <Compile Include="API\PerMapConfigGeneratorSet.cs" />
<Compile Include="API\UpdateResult.cs" />
<Compile Include="InProcess\IMRURunner.cs" />
<Compile Include="InProcess\InProcessIMRUClient.cs" />