You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@reef.apache.org by af...@apache.org on 2016/05/09 21:18:35 UTC

reef git commit: [REEF-1375] Fixing Java multiruntime

Repository: reef
Updated Branches:
  refs/heads/master 040a6b366 -> 913c66cc7


[REEF-1375] Fixing Java multiruntime

Addresses the issue by:
1) Fixing the multiruntime configuration builder by adding additioanl configurations that are required
2) Fixing test to actually use multiruntime

JIRA:
[REEF-1375](https://issues.apache.org/jira/browse/REEF-1375)

Pull Request:
  Closes #983


Project: http://git-wip-us.apache.org/repos/asf/reef/repo
Commit: http://git-wip-us.apache.org/repos/asf/reef/commit/913c66cc
Tree: http://git-wip-us.apache.org/repos/asf/reef/tree/913c66cc
Diff: http://git-wip-us.apache.org/repos/asf/reef/diff/913c66cc

Branch: refs/heads/master
Commit: 913c66cc70b20691bf45c1a3bcb5e035c45e6af2
Parents: 040a6b3
Author: Boris Shulman <sh...@gmail.com>
Authored: Mon May 2 00:56:56 2016 -0700
Committer: Andrew Chung <af...@gmail.com>
Committed: Mon May 9 13:17:53 2016 -0700

----------------------------------------------------------------------
 .../hellomultiruntime/HelloREEFMultiYarn.java   |  2 +-
 .../src/main/avro/RuntimeDefinition.avsc        |  6 +--
 ...tiRuntimeMainConfigurationGeneratorImpl.java | 46 +++++++++++++++++
 .../MultiRuntimeConfigurationBuilder.java       | 30 ++++++-----
 .../client/MultiRuntimeDefinitionBuilder.java   | 18 ++++---
 .../client/MultiRuntimeDefinitionGenerator.java | 14 ++++--
 .../MultiRuntimeDefinitionGeneratorImpl.java    | 18 ++++---
 ...MultiRuntimeDriverConfigurationProvider.java | 21 +++++---
 .../client/MultiRuntimeHelperConfiguration.java | 28 -----------
 .../MultiRuntimeMainConfigurationGenerator.java | 46 +++++++++++++++++
 ...tiRuntimeMainConfigurationGeneratorImpl.java | 53 ++++++++++++++++++++
 .../reef/runtime/multi/driver/RuntimesHost.java |  8 +--
 .../utils/MultiRuntimeDefinitionSerializer.java | 17 ++++---
 .../runtime/multi/driver/RuntimesHostTest.java  |  4 +-
 .../MultiRuntimeDefinitionSerializerTests.java  | 12 ++---
 .../reef/tests/examples/ExamplesTestSuite.java  |  3 +-
 .../examples/TestHelloREEFMultiRuntime.java     | 21 ++++++--
 17 files changed, 252 insertions(+), 95 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-examples/src/main/java/org/apache/reef/examples/hellomultiruntime/HelloREEFMultiYarn.java
----------------------------------------------------------------------
diff --git a/lang/java/reef-examples/src/main/java/org/apache/reef/examples/hellomultiruntime/HelloREEFMultiYarn.java b/lang/java/reef-examples/src/main/java/org/apache/reef/examples/hellomultiruntime/HelloREEFMultiYarn.java
index 5df7b25..8d8a95c 100644
--- a/lang/java/reef-examples/src/main/java/org/apache/reef/examples/hellomultiruntime/HelloREEFMultiYarn.java
+++ b/lang/java/reef-examples/src/main/java/org/apache/reef/examples/hellomultiruntime/HelloREEFMultiYarn.java
@@ -50,7 +50,7 @@ public final class HelloREEFMultiYarn {
     return DriverConfiguration.CONF
         .set(DriverConfiguration.GLOBAL_LIBRARIES,
             HelloREEFMultiYarn.class.getProtectionDomain().getCodeSource().getLocation().getFile())
-        .set(DriverConfiguration.DRIVER_IDENTIFIER, "HelloREEF")
+        .set(DriverConfiguration.DRIVER_IDENTIFIER, "HelloREEFMultiYarn")
         .set(DriverConfiguration.ON_DRIVER_STARTED, HelloMultiRuntimeDriver.StartHandler.class)
         .set(DriverConfiguration.ON_EVALUATOR_ALLOCATED, HelloMultiRuntimeDriver.EvaluatorAllocatedHandler.class)
         .build();

http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-runtime-multi/src/main/avro/RuntimeDefinition.avsc
----------------------------------------------------------------------
diff --git a/lang/java/reef-runtime-multi/src/main/avro/RuntimeDefinition.avsc b/lang/java/reef-runtime-multi/src/main/avro/RuntimeDefinition.avsc
index 2e81ffa..ceb65e2 100644
--- a/lang/java/reef-runtime-multi/src/main/avro/RuntimeDefinition.avsc
+++ b/lang/java/reef-runtime-multi/src/main/avro/RuntimeDefinition.avsc
@@ -24,7 +24,7 @@
  {
     "namespace":"org.apache.reef.runtime.multi.utils.avro",
     "type":"record",
-    "name":"RuntimeDefinition",
+    "name":"AvroRuntimeDefinition",
     "doc":"Defines the schema for runtime definition. This avro object is used to pass runtimes definitions to the runtimes host",
     "fields":[
       {
@@ -46,7 +46,7 @@
  {
     "namespace":"org.apache.reef.runtime.multi.utils.avro",
     "type":"record",
-    "name":"MultiRuntimeDefinition",
+    "name":"AvroMultiRuntimeDefinition",
     "doc":"Defines the schema for multi runtime definition. This avro object is used to pass multi runtime definition to the runtimes host",
     "fields":[
       {
@@ -56,7 +56,7 @@
       },
       {
         "name":"runtimes",
-        "type":{"type":"array", "items":"RuntimeDefinition"},
+        "type":{"type":"array", "items":"AvroRuntimeDefinition"},
         "doc":"defined runtimes"
       }
     ]

http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/EmptyMultiRuntimeMainConfigurationGeneratorImpl.java
----------------------------------------------------------------------
diff --git a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/EmptyMultiRuntimeMainConfigurationGeneratorImpl.java b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/EmptyMultiRuntimeMainConfigurationGeneratorImpl.java
new file mode 100644
index 0000000..b79a7da
--- /dev/null
+++ b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/EmptyMultiRuntimeMainConfigurationGeneratorImpl.java
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ */
+
+package org.apache.reef.runtime.multi.client;
+
+import org.apache.reef.tang.Configuration;
+import org.apache.reef.tang.Tang;
+
+import javax.inject.Inject;
+
+/**
+ * Default implementation for MultiRuntimeMainConfigurationGenerator that returns an empty configuration.
+ */
+final class EmptyMultiRuntimeMainConfigurationGeneratorImpl
+        implements MultiRuntimeMainConfigurationGenerator {
+
+  @Inject
+  private EmptyMultiRuntimeMainConfigurationGeneratorImpl() {
+  }
+
+  /**
+   * Generates needed driver configuration such as class path provider.
+   *
+   * @return Instance of <code>Configuration</code>
+   */
+  @Override
+  public Configuration getMainConfiguration() {
+    return Tang.Factory.getTang().newConfigurationBuilder().build();
+  }
+}

http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeConfigurationBuilder.java
----------------------------------------------------------------------
diff --git a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeConfigurationBuilder.java b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeConfigurationBuilder.java
index 9851cc9..b9cc1cc 100644
--- a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeConfigurationBuilder.java
+++ b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeConfigurationBuilder.java
@@ -19,6 +19,7 @@
 package org.apache.reef.runtime.multi.client;
 
 import org.apache.commons.lang.Validate;
+import org.apache.reef.annotations.Unstable;
 import org.apache.reef.runtime.local.client.parameters.MaxNumberOfEvaluators;
 import org.apache.reef.runtime.multi.client.parameters.DefaultRuntimeName;
 import org.apache.reef.runtime.multi.client.parameters.RuntimeNames;
@@ -26,7 +27,8 @@ import org.apache.reef.runtime.yarn.client.ExtensibleYarnClientConfiguration;
 import org.apache.reef.runtime.yarn.driver.RuntimeIdentifier;
 import org.apache.reef.tang.Configuration;
 import org.apache.reef.tang.Configurations;
-import org.apache.reef.tang.formats.ConfigurationModuleBuilder;
+import org.apache.reef.tang.JavaConfigurationBuilder;
+import org.apache.reef.tang.Tang;
 import org.apache.reef.util.Optional;
 
 import java.util.*;
@@ -34,6 +36,7 @@ import java.util.*;
 /**
  * A builder for Multi Runtime Configuration.
  */
+@Unstable
 public final class MultiRuntimeConfigurationBuilder {
   private static final Set<String> SUPPORTED_RUNTIMES = new HashSet<>(Arrays.asList(
           org.apache.reef.runtime.yarn.driver.RuntimeIdentifier.RUNTIME_NAME,
@@ -45,7 +48,7 @@ public final class MultiRuntimeConfigurationBuilder {
 
   private Set<String> runtimeNames = new HashSet<>();
   private Optional<String> defaultRuntime = Optional.empty();
-  private String submissionRunitme;
+  private String submissionRuntime;
 
   private void addNamedParameter(final Class namedParameter,
                                  final Object namedParameterValue) {
@@ -85,11 +88,12 @@ public final class MultiRuntimeConfigurationBuilder {
    * @return The builder instance
    */
   public MultiRuntimeConfigurationBuilder setSubmissionRuntime(final String runtimeName) {
-    Validate.isTrue(SUPPORTED_SUBMISSION_RUNTIMES.contains(runtimeName), "Unsupported submission runtime " +
+    Validate.isTrue(
+            SUPPORTED_SUBMISSION_RUNTIMES.contains(runtimeName), "Unsupported submission runtime " +
             runtimeName);
-    Validate.isTrue(this.submissionRunitme == null, "Submission runtime was already added");
+    Validate.isTrue(this.submissionRuntime == null, "Submission runtime was already added");
 
-    this.submissionRunitme = runtimeName;
+    this.submissionRuntime = runtimeName;
     return this;
   }
 
@@ -110,7 +114,7 @@ public final class MultiRuntimeConfigurationBuilder {
    * @return The built configuration
    */
   public Configuration build() {
-    Validate.notNull(this.submissionRunitme, "Default Runtime was not defined");
+    Validate.notNull(this.submissionRuntime, "Default Runtime was not defined");
 
     if(!this.defaultRuntime.isPresent() || this.runtimeNames.size() == 1){
       this.defaultRuntime = Optional.of(this.runtimeNames.toArray(new String[0])[0]);
@@ -123,7 +127,7 @@ public final class MultiRuntimeConfigurationBuilder {
       this.runtimeNames.add(this.defaultRuntime.get());
     }
 
-    ConfigurationModuleBuilder conf = new MultiRuntimeHelperConfiguration();
+    JavaConfigurationBuilder conf = Tang.Factory.getTang().newConfigurationBuilder();
 
     for(Map.Entry<Class, Object> entry: this.namedParameters.entrySet()){
       conf = conf.bindNamedParameter(entry.getKey(), entry.getValue().toString());
@@ -135,15 +139,15 @@ public final class MultiRuntimeConfigurationBuilder {
       conf = conf.bindSetEntry(RuntimeNames.class, runtimeName);
     }
 
-    conf = conf.bindImplementation(
-            MultiRuntimeDefinitionGenerator.class, MultiRuntimeDefinitionGeneratorImpl.class);
-
-    if(!this.submissionRunitme.equalsIgnoreCase(RuntimeIdentifier.RUNTIME_NAME)){
-      throw new RuntimeException("Unsupported submission runtime " + this.submissionRunitme);
+    if(!this.submissionRuntime.equalsIgnoreCase(RuntimeIdentifier.RUNTIME_NAME)){
+      throw new RuntimeException("Unsupported submission runtime " + this.submissionRuntime);
     }
 
+    conf = conf.bindImplementation(MultiRuntimeMainConfigurationGenerator.class,
+            YarnMultiRuntimeMainConfigurationGeneratorImpl.class);
+
     // Currently only local runtime is supported as a secondary runtime
-    return Configurations.merge(conf.build().build(),
+    return Configurations.merge(conf.build(),
             ExtensibleYarnClientConfiguration.CONF
                     .set(ExtensibleYarnClientConfiguration.DRIVER_CONFIGURATION_PROVIDER,
                             MultiRuntimeDriverConfigurationProvider.class).build());

http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDefinitionBuilder.java
----------------------------------------------------------------------
diff --git a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDefinitionBuilder.java b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDefinitionBuilder.java
index edb0667..7d60e92 100644
--- a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDefinitionBuilder.java
+++ b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDefinitionBuilder.java
@@ -20,8 +20,9 @@ package org.apache.reef.runtime.multi.client;
 
 import org.apache.commons.lang.Validate;
 import org.apache.commons.lang.StringUtils;
-import org.apache.reef.runtime.multi.utils.avro.MultiRuntimeDefinition;
-import org.apache.reef.runtime.multi.utils.avro.RuntimeDefinition;
+import org.apache.reef.annotations.Unstable;
+import org.apache.reef.runtime.multi.utils.avro.AvroMultiRuntimeDefinition;
+import org.apache.reef.runtime.multi.utils.avro.AvroRuntimeDefinition;
 import org.apache.reef.tang.Configuration;
 import org.apache.reef.tang.formats.AvroConfigurationSerializer;
 
@@ -32,16 +33,17 @@ import java.util.Map;
 /**
  * Builder for multi runtime definition.
  */
+@Unstable
 public final class MultiRuntimeDefinitionBuilder {
-  private Map<String, RuntimeDefinition> runtimes = new HashMap<>();
+  private Map<String, AvroRuntimeDefinition> runtimes = new HashMap<>();
   private String defaultRuntime;
 
-  private static RuntimeDefinition createRuntimeDefinition(final Configuration configModule,
+  private static AvroRuntimeDefinition createRuntimeDefinition(final Configuration configModule,
                                                              final String runtimeName) {
     final Configuration localDriverConfiguration = configModule;
     final AvroConfigurationSerializer serializer = new AvroConfigurationSerializer();
     final String serializedConfig = serializer.toString(localDriverConfiguration);
-    return new RuntimeDefinition(runtimeName, serializedConfig);
+    return new AvroRuntimeDefinition(runtimeName, serializedConfig);
   }
 
   /**
@@ -54,7 +56,7 @@ public final class MultiRuntimeDefinitionBuilder {
     Validate.notNull(config, "runtime configuration module should not be null");
     Validate.isTrue(StringUtils.isNotBlank(runtimeName),
             "runtimeName should be non empty and non blank string");
-    final RuntimeDefinition rd = createRuntimeDefinition(config, runtimeName);
+    final AvroRuntimeDefinition rd = createRuntimeDefinition(config, runtimeName);
     this.runtimes.put(runtimeName, rd);
     return this;
   }
@@ -75,7 +77,7 @@ public final class MultiRuntimeDefinitionBuilder {
    * Builds multi runtime definition.
    * @return The populated definition object
    */
-  public MultiRuntimeDefinition build(){
+  public AvroMultiRuntimeDefinition build(){
     Validate.isTrue(this.runtimes.size() == 1 || !StringUtils.isEmpty(this.defaultRuntime), "Default runtime " +
             "should be set if more than a single runtime provided");
 
@@ -85,6 +87,6 @@ public final class MultiRuntimeDefinitionBuilder {
     }
 
     Validate.isTrue(this.runtimes.containsKey(this.defaultRuntime), "Default runtime should be configured");
-    return new MultiRuntimeDefinition(defaultRuntime, new ArrayList<>(this.runtimes.values()));
+    return new AvroMultiRuntimeDefinition(defaultRuntime, new ArrayList<>(this.runtimes.values()));
   }
 }

http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDefinitionGenerator.java
----------------------------------------------------------------------
diff --git a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDefinitionGenerator.java b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDefinitionGenerator.java
index faf4901..0deea08 100644
--- a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDefinitionGenerator.java
+++ b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDefinitionGenerator.java
@@ -19,13 +19,19 @@
 
 package org.apache.reef.runtime.multi.client;
 
-import org.apache.reef.runtime.multi.utils.avro.MultiRuntimeDefinition;
+import org.apache.reef.annotations.Unstable;
+import org.apache.reef.runtime.multi.utils.avro.AvroMultiRuntimeDefinition;
+import org.apache.reef.tang.annotations.DefaultImplementation;
 
 import java.net.URI;
 
 /**
  * Defines a contract for a multi runtime definition generator.
+ * The multi runtime avro definition contains all the needed information to instantiate
+ * runtimes inside runtime host.
  */
+@DefaultImplementation(MultiRuntimeDefinitionGeneratorImpl.class)
+@Unstable
 public interface MultiRuntimeDefinitionGenerator {
   /**
    * Generates needed driver configuration modules.
@@ -35,8 +41,8 @@ public interface MultiRuntimeDefinitionGenerator {
    * @param jobId          the job id
    * @return Instance of <code>MultiRuntimeDefinition</code>
    */
-  MultiRuntimeDefinition getMultiRuntimeDefinition(final URI jobFolder,
-                                                   final String clientRemoteId,
-                                                   final String jobId);
+  AvroMultiRuntimeDefinition getMultiRuntimeDefinition(final URI jobFolder,
+                                                       final String clientRemoteId,
+                                                       final String jobId);
 
 }

http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDefinitionGeneratorImpl.java
----------------------------------------------------------------------
diff --git a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDefinitionGeneratorImpl.java b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDefinitionGeneratorImpl.java
index b44c72d..7217da7 100644
--- a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDefinitionGeneratorImpl.java
+++ b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDefinitionGeneratorImpl.java
@@ -28,7 +28,7 @@ import org.apache.reef.runtime.local.client.parameters.RackNames;
 import org.apache.reef.runtime.local.driver.LocalDriverConfiguration;
 import org.apache.reef.runtime.multi.client.parameters.DefaultRuntimeName;
 import org.apache.reef.runtime.multi.client.parameters.RuntimeNames;
-import org.apache.reef.runtime.multi.utils.avro.MultiRuntimeDefinition;
+import org.apache.reef.runtime.multi.utils.avro.AvroMultiRuntimeDefinition;
 import org.apache.reef.runtime.yarn.driver.RuntimeIdentifier;
 import org.apache.reef.runtime.yarn.driver.YarnDriverConfiguration;
 import org.apache.reef.tang.Configuration;
@@ -42,7 +42,7 @@ import java.util.Map;
 import java.util.Set;
 
 /**
- * MultiRuntime configuration provider.
+ * MultiRuntime definition provider. Creates avro definition for the multi runtime environment.
  */
 @Private
 @RuntimeAuthor
@@ -107,7 +107,9 @@ final class MultiRuntimeDefinitionGeneratorImpl implements MultiRuntimeDefinitio
             .set(YarnDriverConfiguration.JOB_SUBMISSION_DIRECTORY, jobFolder.toString())
             .set(YarnDriverConfiguration.JOB_IDENTIFIER, jobId)
             .set(YarnDriverConfiguration.CLIENT_REMOTE_IDENTIFIER, clientRemoteId)
-            .set(YarnDriverConfiguration.JVM_HEAP_SLACK, this.jvmSlack).build();
+            .set(YarnDriverConfiguration.JVM_HEAP_SLACK, this.jvmSlack)
+            .set(YarnDriverConfiguration.RUNTIME_NAMES, RuntimeIdentifier.RUNTIME_NAME)
+            .build();
 
   }
 
@@ -121,7 +123,9 @@ final class MultiRuntimeDefinitionGeneratorImpl implements MultiRuntimeDefinitio
             .set(LocalDriverConfiguration.ROOT_FOLDER, ".")
             .set(LocalDriverConfiguration.JVM_HEAP_SLACK, this.jvmSlack)
             .set(LocalDriverConfiguration.CLIENT_REMOTE_IDENTIFIER, clientRemoteId)
-            .set(LocalDriverConfiguration.JOB_IDENTIFIER, jobId);
+            .set(LocalDriverConfiguration.JOB_IDENTIFIER, jobId)
+            .set(LocalDriverConfiguration.RUNTIME_NAMES,
+                    org.apache.reef.runtime.local.driver.RuntimeIdentifier.RUNTIME_NAME);
     for (final String rackName : rackNames) {
       localModule = localModule.set(LocalDriverConfiguration.RACK_NAMES, rackName);
     }
@@ -130,9 +134,9 @@ final class MultiRuntimeDefinitionGeneratorImpl implements MultiRuntimeDefinitio
   }
 
 
-  public MultiRuntimeDefinition getMultiRuntimeDefinition(final URI jobFolder,
-                                                          final String clientRemoteId,
-                                                          final String jobId) {
+  public AvroMultiRuntimeDefinition getMultiRuntimeDefinition(final URI jobFolder,
+                                                              final String clientRemoteId,
+                                                              final String jobId) {
 
 
     MultiRuntimeDefinitionBuilder builder = new MultiRuntimeDefinitionBuilder();

http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDriverConfigurationProvider.java
----------------------------------------------------------------------
diff --git a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDriverConfigurationProvider.java b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDriverConfigurationProvider.java
index 3e9b82e..6dac3e5 100644
--- a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDriverConfigurationProvider.java
+++ b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeDriverConfigurationProvider.java
@@ -21,8 +21,8 @@ package org.apache.reef.runtime.multi.client;
 import org.apache.reef.runtime.common.client.DriverConfigurationProvider;
 import org.apache.reef.runtime.multi.driver.MultiRuntimeDriverConfiguration;
 import org.apache.reef.runtime.multi.utils.MultiRuntimeDefinitionSerializer;
-import org.apache.reef.runtime.multi.utils.avro.MultiRuntimeDefinition;
-import org.apache.reef.runtime.multi.utils.avro.RuntimeDefinition;
+import org.apache.reef.runtime.multi.utils.avro.AvroMultiRuntimeDefinition;
+import org.apache.reef.runtime.multi.utils.avro.AvroRuntimeDefinition;
 import org.apache.reef.tang.Configuration;
 import org.apache.reef.tang.Configurations;
 import org.apache.reef.tang.formats.ConfigurationModule;
@@ -35,11 +35,15 @@ import java.net.URI;
  */
 final class MultiRuntimeDriverConfigurationProvider implements DriverConfigurationProvider {
   private final MultiRuntimeDefinitionSerializer runtimeDefinitionSerializer = new MultiRuntimeDefinitionSerializer();
+  private final MultiRuntimeMainConfigurationGenerator mainRuntimeConfigGenerator;
   private MultiRuntimeDefinitionGenerator definitionGenerator;
 
   @Inject
-  MultiRuntimeDriverConfigurationProvider(final MultiRuntimeDefinitionGenerator definitionGenerator) {
+  MultiRuntimeDriverConfigurationProvider(
+          final MultiRuntimeDefinitionGenerator definitionGenerator,
+          final MultiRuntimeMainConfigurationGenerator mainRuntimeConfigGenerator) {
     this.definitionGenerator = definitionGenerator;
+    this.mainRuntimeConfigGenerator = mainRuntimeConfigGenerator;
   }
 
   /**
@@ -57,21 +61,24 @@ final class MultiRuntimeDriverConfigurationProvider implements DriverConfigurati
                                               final String clientRemoteId,
                                               final String jobId,
                                               final Configuration applicationConfiguration) {
-    MultiRuntimeDefinition runtimeDefinitions = this.definitionGenerator.getMultiRuntimeDefinition(
+    AvroMultiRuntimeDefinition runtimeDefinitions = this.definitionGenerator.getMultiRuntimeDefinition(
             jobFolder,
             clientRemoteId,
             jobId);
     ConfigurationModule conf = MultiRuntimeDriverConfiguration.CONF;
 
-    for(RuntimeDefinition runtimeDefinition : runtimeDefinitions.getRuntimes()){
+    for(AvroRuntimeDefinition runtimeDefinition : runtimeDefinitions.getRuntimes()){
       conf = conf.set(MultiRuntimeDriverConfiguration.RUNTIME_NAMES, runtimeDefinition.getRuntimeName().toString());
     }
 
-    return Configurations.merge(applicationConfiguration,
+    final Configuration mainConfiguration = this.mainRuntimeConfigGenerator.getMainConfiguration();
+
+    return Configurations.merge(mainConfiguration, applicationConfiguration,
                     conf
                     .set(MultiRuntimeDriverConfiguration.JOB_IDENTIFIER, jobId)
                     .set(MultiRuntimeDriverConfiguration.CLIENT_REMOTE_IDENTIFIER, clientRemoteId)
                     .set(MultiRuntimeDriverConfiguration.SERIALIZED_RUNTIME_DEFINITION,
-                            this.runtimeDefinitionSerializer.toString(runtimeDefinitions)).build());
+                            this.runtimeDefinitionSerializer.toString(runtimeDefinitions))
+                    .build());
   }
 }

http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeHelperConfiguration.java
----------------------------------------------------------------------
diff --git a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeHelperConfiguration.java b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeHelperConfiguration.java
deleted file mode 100644
index 1a5ff69..0000000
--- a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeHelperConfiguration.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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.
- */
-package org.apache.reef.runtime.multi.client;
-
-import org.apache.reef.tang.formats.ConfigurationModuleBuilder;
-
-/**
- * A ConfigurationModule to bind arbitrary named parameters for runtimes.
- */
-final class MultiRuntimeHelperConfiguration extends ConfigurationModuleBuilder {
-}
-

http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeMainConfigurationGenerator.java
----------------------------------------------------------------------
diff --git a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeMainConfigurationGenerator.java b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeMainConfigurationGenerator.java
new file mode 100644
index 0000000..bd9698e
--- /dev/null
+++ b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/MultiRuntimeMainConfigurationGenerator.java
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ */
+
+package org.apache.reef.runtime.multi.client;
+
+import org.apache.reef.annotations.Unstable;
+import org.apache.reef.annotations.audience.RuntimeAuthor;
+import org.apache.reef.tang.Configuration;
+import org.apache.reef.tang.annotations.DefaultImplementation;
+
+/**
+ * Defines a contract for a multi runtime main configuration.
+ * Main configuration is the configuration  that allows multi runtime to be initialized in the certain concrete
+ * environment. For example, when operating in  the yarn runtime, multi runtime needs to receive the proper
+ * classpath provider as well as the constructor for the YarnConfiguration.
+ * classpath provider as well as the constructor for the YarnConfiguration.
+ * Main configuration is provided in the context of the main runtime. Main runtime is the runtime that actually runs
+ * multi runtime host that hosts the actual runtimes.
+ *The main configuration is generated on the client and is merged into the driver configuration.
+ */
+@DefaultImplementation(EmptyMultiRuntimeMainConfigurationGeneratorImpl.class)
+@Unstable
+@RuntimeAuthor
+interface MultiRuntimeMainConfigurationGenerator {
+  /**
+   * Generates needed driver configuration such as class path provider.
+   * @return Instance of <code>Configuration</code>
+   */
+  Configuration getMainConfiguration();
+}

http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/YarnMultiRuntimeMainConfigurationGeneratorImpl.java
----------------------------------------------------------------------
diff --git a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/YarnMultiRuntimeMainConfigurationGeneratorImpl.java b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/YarnMultiRuntimeMainConfigurationGeneratorImpl.java
new file mode 100644
index 0000000..e9e7fdf
--- /dev/null
+++ b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/client/YarnMultiRuntimeMainConfigurationGeneratorImpl.java
@@ -0,0 +1,53 @@
+/*
+ * 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.
+ */
+
+package org.apache.reef.runtime.multi.client;
+
+import org.apache.reef.runtime.common.files.RuntimeClasspathProvider;
+import org.apache.reef.runtime.yarn.YarnClasspathProvider;
+import org.apache.reef.runtime.yarn.util.YarnConfigurationConstructor;
+import org.apache.reef.tang.Configuration;
+import org.apache.reef.tang.Tang;
+
+import javax.inject.Inject;
+
+/**
+ * Yarn implementation for MultiRuntimeMainConfigurationGenerator.
+ */
+final class YarnMultiRuntimeMainConfigurationGeneratorImpl
+        implements MultiRuntimeMainConfigurationGenerator {
+
+  @Inject
+  private YarnMultiRuntimeMainConfigurationGeneratorImpl() {
+  }
+
+  /**
+   * Generates configuration that allows multi runtime to run on Yarn.
+   * MultiRuntimeMainConfigurationGenerator.
+   * @return Instance of <code>Configuration</code>
+   */
+  @Override
+  public Configuration getMainConfiguration() {
+
+    return Tang.Factory.getTang().newConfigurationBuilder()
+            .bindImplementation(RuntimeClasspathProvider.class, YarnClasspathProvider.class)
+            .bindConstructor(org.apache.hadoop.yarn.conf.YarnConfiguration.class, YarnConfigurationConstructor.class)
+            .build();
+  }
+}

http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/driver/RuntimesHost.java
----------------------------------------------------------------------
diff --git a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/driver/RuntimesHost.java b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/driver/RuntimesHost.java
index 00d3a62..bfbc037 100644
--- a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/driver/RuntimesHost.java
+++ b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/driver/RuntimesHost.java
@@ -28,8 +28,8 @@ import org.apache.reef.runtime.common.driver.resourcemanager.RuntimeStatusEvent;
 import org.apache.reef.runtime.multi.client.parameters.SerializedRuntimeDefinition;
 import org.apache.reef.runtime.multi.driver.parameters.RuntimeName;
 import org.apache.reef.runtime.multi.utils.MultiRuntimeDefinitionSerializer;
-import org.apache.reef.runtime.multi.utils.avro.MultiRuntimeDefinition;
-import org.apache.reef.runtime.multi.utils.avro.RuntimeDefinition;
+import org.apache.reef.runtime.multi.utils.avro.AvroMultiRuntimeDefinition;
+import org.apache.reef.runtime.multi.utils.avro.AvroRuntimeDefinition;
 import org.apache.reef.tang.Configuration;
 import org.apache.reef.tang.Injector;
 import org.apache.reef.tang.JavaConfigurationBuilder;
@@ -50,7 +50,7 @@ import java.util.Map;
  * Hosts the actual runtime implementations and delegates invocations to them.
  */
 final class RuntimesHost {
-  private final MultiRuntimeDefinition runtimeDefinition;
+  private final AvroMultiRuntimeDefinition runtimeDefinition;
   private final Injector originalInjector;
   private final String defaultRuntimeName;
   private final MultiRuntimeDefinitionSerializer  runtimeDefinitionSerializer = new MultiRuntimeDefinitionSerializer();
@@ -79,7 +79,7 @@ final class RuntimesHost {
 
     this.runtimes = new HashMap<>();
 
-    for (final RuntimeDefinition rd : runtimeDefinition.getRuntimes()) {
+    for (final AvroRuntimeDefinition rd : runtimeDefinition.getRuntimes()) {
       try {
 
         // We need to create different injector for each runtime as they define conflicting bindings. Also we cannot

http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/utils/MultiRuntimeDefinitionSerializer.java
----------------------------------------------------------------------
diff --git a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/utils/MultiRuntimeDefinitionSerializer.java b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/utils/MultiRuntimeDefinitionSerializer.java
index ba836c1..f9ad2dc 100644
--- a/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/utils/MultiRuntimeDefinitionSerializer.java
+++ b/lang/java/reef-runtime-multi/src/main/java/org/apache/reef/runtime/multi/utils/MultiRuntimeDefinitionSerializer.java
@@ -22,7 +22,7 @@ package org.apache.reef.runtime.multi.utils;
 import org.apache.avro.io.*;
 import org.apache.avro.specific.SpecificDatumReader;
 import org.apache.avro.specific.SpecificDatumWriter;
-import org.apache.reef.runtime.multi.utils.avro.MultiRuntimeDefinition;
+import org.apache.reef.runtime.multi.utils.avro.AvroMultiRuntimeDefinition;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -39,9 +39,9 @@ public final class MultiRuntimeDefinitionSerializer {
    * @param runtimeDefinition the Avro object to toString
    * @return Serialized avro string
    */
-  public String toString(final MultiRuntimeDefinition runtimeDefinition){
-    final DatumWriter<MultiRuntimeDefinition> configurationWriter =
-            new SpecificDatumWriter<>(MultiRuntimeDefinition.class);
+  public String toString(final AvroMultiRuntimeDefinition runtimeDefinition){
+    final DatumWriter<AvroMultiRuntimeDefinition> configurationWriter =
+            new SpecificDatumWriter<>(AvroMultiRuntimeDefinition.class);
     final String serializedConfiguration;
     try (final ByteArrayOutputStream out = new ByteArrayOutputStream()) {
       final JsonEncoder encoder = EncoderFactory.get().jsonEncoder(runtimeDefinition.getSchema(), out);
@@ -62,12 +62,13 @@ public final class MultiRuntimeDefinitionSerializer {
    * @return Avro object
    * @throws IOException
    */
-  public MultiRuntimeDefinition fromString(final String serializedRuntimeDefinition) throws
+  public AvroMultiRuntimeDefinition fromString(final String serializedRuntimeDefinition) throws
           IOException{
     final JsonDecoder decoder = DecoderFactory.get().
-            jsonDecoder(MultiRuntimeDefinition.getClassSchema(), serializedRuntimeDefinition);
-    final SpecificDatumReader<MultiRuntimeDefinition> reader = new SpecificDatumReader<>(MultiRuntimeDefinition.class);
-    final MultiRuntimeDefinition rd = reader.read(null, decoder);
+            jsonDecoder(AvroMultiRuntimeDefinition.getClassSchema(), serializedRuntimeDefinition);
+    final SpecificDatumReader<AvroMultiRuntimeDefinition> reader = new SpecificDatumReader<>(AvroMultiRuntimeDefinition
+            .class);
+    final AvroMultiRuntimeDefinition rd = reader.read(null, decoder);
     return rd;
   }
 }

http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-runtime-multi/src/test/java/org/apache/reef/runtime/multi/driver/RuntimesHostTest.java
----------------------------------------------------------------------
diff --git a/lang/java/reef-runtime-multi/src/test/java/org/apache/reef/runtime/multi/driver/RuntimesHostTest.java b/lang/java/reef-runtime-multi/src/test/java/org/apache/reef/runtime/multi/driver/RuntimesHostTest.java
index 5f855f1..05c5bda 100644
--- a/lang/java/reef-runtime-multi/src/test/java/org/apache/reef/runtime/multi/driver/RuntimesHostTest.java
+++ b/lang/java/reef-runtime-multi/src/test/java/org/apache/reef/runtime/multi/driver/RuntimesHostTest.java
@@ -27,7 +27,7 @@ import org.apache.reef.runtime.local.driver.*;
 import org.apache.reef.runtime.multi.client.MultiRuntimeDefinitionBuilder;
 import org.apache.reef.runtime.multi.client.parameters.SerializedRuntimeDefinition;
 import org.apache.reef.runtime.multi.utils.MultiRuntimeDefinitionSerializer;
-import org.apache.reef.runtime.multi.utils.avro.MultiRuntimeDefinition;
+import org.apache.reef.runtime.multi.utils.avro.AvroMultiRuntimeDefinition;
 import org.apache.reef.tang.*;
 import org.apache.reef.tang.exceptions.InjectionException;
 import org.apache.reef.tang.formats.ConfigurationModule;
@@ -245,7 +245,7 @@ public class RuntimesHostTest {
     Assert.assertTrue(obj instanceof RuntimeStart);
   }
 
-  private String getRuntimeDefinition(final MultiRuntimeDefinition rd) {
+  private String getRuntimeDefinition(final AvroMultiRuntimeDefinition rd) {
     return new MultiRuntimeDefinitionSerializer().toString(rd);
   }
 

http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-runtime-multi/src/test/java/org/apache/reef/runtime/multi/utils/MultiRuntimeDefinitionSerializerTests.java
----------------------------------------------------------------------
diff --git a/lang/java/reef-runtime-multi/src/test/java/org/apache/reef/runtime/multi/utils/MultiRuntimeDefinitionSerializerTests.java b/lang/java/reef-runtime-multi/src/test/java/org/apache/reef/runtime/multi/utils/MultiRuntimeDefinitionSerializerTests.java
index b596880..38bca11 100644
--- a/lang/java/reef-runtime-multi/src/test/java/org/apache/reef/runtime/multi/utils/MultiRuntimeDefinitionSerializerTests.java
+++ b/lang/java/reef-runtime-multi/src/test/java/org/apache/reef/runtime/multi/utils/MultiRuntimeDefinitionSerializerTests.java
@@ -18,8 +18,8 @@
  */
 package org.apache.reef.runtime.multi.utils;
 
-import org.apache.reef.runtime.multi.utils.avro.MultiRuntimeDefinition;
-import org.apache.reef.runtime.multi.utils.avro.RuntimeDefinition;
+import org.apache.reef.runtime.multi.utils.avro.AvroMultiRuntimeDefinition;
+import org.apache.reef.runtime.multi.utils.avro.AvroRuntimeDefinition;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -33,14 +33,14 @@ public class MultiRuntimeDefinitionSerializerTests {
   @Test
   public void testSerailze() throws IOException {
     final MultiRuntimeDefinitionSerializer serializer = new MultiRuntimeDefinitionSerializer();
-    final MultiRuntimeDefinition def = new MultiRuntimeDefinition();
-    final RuntimeDefinition rd = new RuntimeDefinition();
+    final AvroMultiRuntimeDefinition def = new AvroMultiRuntimeDefinition();
+    final AvroRuntimeDefinition rd = new AvroRuntimeDefinition();
     rd.setRuntimeName("default");
     rd.setSerializedConfiguration("config");
     def.setDefaultRuntimeName("default");
-    def.setRuntimes(Arrays.asList(new RuntimeDefinition[]{rd}));
+    def.setRuntimes(Arrays.asList(new AvroRuntimeDefinition[]{rd}));
     final String serialized = serializer.toString(def);
-    final MultiRuntimeDefinition fromStringdef = serializer.fromString(serialized);
+    final AvroMultiRuntimeDefinition fromStringdef = serializer.fromString(serialized);
     Assert.assertEquals(def, fromStringdef);
   }
 

http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-tests/src/test/java/org/apache/reef/tests/examples/ExamplesTestSuite.java
----------------------------------------------------------------------
diff --git a/lang/java/reef-tests/src/test/java/org/apache/reef/tests/examples/ExamplesTestSuite.java b/lang/java/reef-tests/src/test/java/org/apache/reef/tests/examples/ExamplesTestSuite.java
index 3ec0ec8..290d2c1 100644
--- a/lang/java/reef-tests/src/test/java/org/apache/reef/tests/examples/ExamplesTestSuite.java
+++ b/lang/java/reef-tests/src/test/java/org/apache/reef/tests/examples/ExamplesTestSuite.java
@@ -26,7 +26,8 @@ import org.junit.runners.Suite;
  */
 @RunWith(Suite.class)
 @Suite.SuiteClasses({
-    TestHelloREEF.class
+    TestHelloREEF.class,
+    TestHelloREEFMultiRuntime.class
     })
 public final class ExamplesTestSuite {
 }

http://git-wip-us.apache.org/repos/asf/reef/blob/913c66cc/lang/java/reef-tests/src/test/java/org/apache/reef/tests/examples/TestHelloREEFMultiRuntime.java
----------------------------------------------------------------------
diff --git a/lang/java/reef-tests/src/test/java/org/apache/reef/tests/examples/TestHelloREEFMultiRuntime.java b/lang/java/reef-tests/src/test/java/org/apache/reef/tests/examples/TestHelloREEFMultiRuntime.java
index ca7491d..5ede109 100644
--- a/lang/java/reef-tests/src/test/java/org/apache/reef/tests/examples/TestHelloREEFMultiRuntime.java
+++ b/lang/java/reef-tests/src/test/java/org/apache/reef/tests/examples/TestHelloREEFMultiRuntime.java
@@ -19,9 +19,13 @@
 package org.apache.reef.tests.examples;
 
 import org.apache.reef.client.DriverConfiguration;
+import org.apache.reef.client.DriverLauncher;
 import org.apache.reef.client.LauncherStatus;
 import org.apache.reef.examples.hellomultiruntime.HelloMultiRuntimeDriver;
+import org.apache.reef.runtime.multi.client.MultiRuntimeConfigurationBuilder;
+import org.apache.reef.runtime.yarn.driver.RuntimeIdentifier;
 import org.apache.reef.tang.Configuration;
+import org.apache.reef.tang.exceptions.InjectionException;
 import org.apache.reef.tests.TestEnvironment;
 import org.apache.reef.tests.TestEnvironmentFactory;
 import org.apache.reef.tests.YarnTestEnvironment;
@@ -48,16 +52,27 @@ public class TestHelloREEFMultiRuntime {
   }
 
   @Test
-  public void testHelloREEFMultiRuntime() {
+  public void testHelloREEFMultiRuntime() throws InjectionException {
     if(this.testEnvironment instanceof YarnTestEnvironment){
       // multi runtime can be tested on yarn only
       final Configuration driverConf = DriverConfiguration.CONF
               .set(DriverConfiguration.GLOBAL_LIBRARIES, EnvironmentUtils.getClassLocation(this.getClass()))
-              .set(DriverConfiguration.DRIVER_IDENTIFIER, "TEST_HelloREEF")
+              .set(DriverConfiguration.DRIVER_IDENTIFIER, "TEST_HelloREEFMultiRunitme")
               .set(DriverConfiguration.ON_DRIVER_STARTED, HelloMultiRuntimeDriver.StartHandler.class)
               .set(DriverConfiguration.ON_EVALUATOR_ALLOCATED, HelloMultiRuntimeDriver.EvaluatorAllocatedHandler.class)
               .build();
-      final LauncherStatus state = this.testEnvironment.run(driverConf);
+
+      // create the multi runtime environment
+      Configuration multiruntimeConfig = new MultiRuntimeConfigurationBuilder()
+              .addRuntime(RuntimeIdentifier.RUNTIME_NAME)
+              .addRuntime(org.apache.reef.runtime.local.driver.RuntimeIdentifier.RUNTIME_NAME)
+              .setDefaultRuntime(RuntimeIdentifier.RUNTIME_NAME)
+              .setMaxEvaluatorsNumberForLocalRuntime(1)
+              .setSubmissionRuntime(RuntimeIdentifier.RUNTIME_NAME)
+              .build();
+
+      final LauncherStatus state = DriverLauncher.getLauncher(multiruntimeConfig).run(driverConf, this
+              .testEnvironment.getTestTimeout());
       Assert.assertTrue("Job state after execution: " + state, state.isSuccess());
     }
   }