Repository: incubator-reef
Updated Branches:
  refs/heads/master 3686fae2b -> a4c78c4a4


[REEF-633] Add a Rack Name extractor in YARN

This adds `RackNameFormatter` and its default implementation,
`DefaultRackNameFormatter` to extract the rack name for a given
container.

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

Pull Request:
  This closes #404


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

Branch: refs/heads/master
Commit: a4c78c4a4a41cf6a6ba6924a48d9873c4245d12d
Parents: 3686fae
Author: Andrew Chung <[email protected]>
Authored: Fri Aug 21 18:25:24 2015 -0700
Committer: Markus Weimer <[email protected]>
Committed: Mon Aug 24 09:51:49 2015 -0700

----------------------------------------------------------------------
 .../yarn/driver/DefaultRackNameFormatter.java   | 56 ++++++++++++++++++++
 .../runtime/yarn/driver/RackNameFormatter.java  | 41 ++++++++++++++
 .../yarn/driver/YarnContainerManager.java       | 22 +++-----
 .../yarn/driver/YarnDriverConfiguration.java    | 11 ++--
 4 files changed, 110 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/a4c78c4a/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/DefaultRackNameFormatter.java
----------------------------------------------------------------------
diff --git 
a/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/DefaultRackNameFormatter.java
 
b/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/DefaultRackNameFormatter.java
new file mode 100644
index 0000000..cd88585
--- /dev/null
+++ 
b/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/DefaultRackNameFormatter.java
@@ -0,0 +1,56 @@
+/*
+ * 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.yarn.driver;
+
+import org.apache.hadoop.yarn.api.records.Container;
+import org.apache.reef.annotations.audience.DriverSide;
+import org.apache.reef.annotations.audience.Private;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+@Private
+@DriverSide
+public class DefaultRackNameFormatter implements RackNameFormatter {
+
+  private static final Logger LOG = 
Logger.getLogger(DefaultRackNameFormatter.class.getName());
+
+  /**
+   * @see {@link RackNameFormatter#getRackName(Container)}.
+   */
+  @Override
+  public String getRackName(final Container container) {
+    final String hostName = container.getNodeId().getHost();
+
+    // the rack name comes as part of the host name, e.g.
+    // <rackName>-<hostNumber>
+    // we perform some checks just in case it doesn't
+    String rackName = null;
+    if (hostName != null) {
+      final String[] rackNameAndNumber = hostName.split("-");
+      if (rackNameAndNumber.length == 2) {
+        rackName = rackNameAndNumber[0];
+      } else {
+        LOG.log(Level.WARNING, "Could not get information from the rack name, 
should use the default");
+      }
+    }
+
+    return rackName;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/a4c78c4a/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/RackNameFormatter.java
----------------------------------------------------------------------
diff --git 
a/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/RackNameFormatter.java
 
b/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/RackNameFormatter.java
new file mode 100644
index 0000000..2825930
--- /dev/null
+++ 
b/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/RackNameFormatter.java
@@ -0,0 +1,41 @@
+/*
+ * 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.yarn.driver;
+
+import org.apache.hadoop.yarn.api.records.Container;
+import org.apache.reef.annotations.audience.DriverSide;
+import org.apache.reef.annotations.audience.Public;
+import org.apache.reef.annotations.audience.RuntimeAuthor;
+import org.apache.reef.tang.annotations.DefaultImplementation;
+
+/**
+ * Provides a method to retrieve the rack name from a container, which
+ * may be dependent on the Hadoop distribution.
+ */
+@Public
+@RuntimeAuthor
+@DriverSide
+@DefaultImplementation(DefaultRackNameFormatter.class)
+public interface RackNameFormatter {
+
+  /**
+   * The rack name of the Container.
+   */
+  String getRackName(final Container container);
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/a4c78c4a/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/YarnContainerManager.java
----------------------------------------------------------------------
diff --git 
a/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/YarnContainerManager.java
 
b/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/YarnContainerManager.java
index a1afe94..27e5662 100644
--- 
a/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/YarnContainerManager.java
+++ 
b/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/YarnContainerManager.java
@@ -75,6 +75,7 @@ final class YarnContainerManager
   private final ContainerRequestCounter containerRequestCounter;
   private final DriverStatusManager driverStatusManager;
   private final TrackingURLProvider trackingURLProvider;
+  private final RackNameFormatter rackNameFormatter;
 
   @Inject
   YarnContainerManager(
@@ -85,7 +86,8 @@ final class YarnContainerManager
       final ApplicationMasterRegistration registration,
       final ContainerRequestCounter containerRequestCounter,
       final DriverStatusManager driverStatusManager,
-      final TrackingURLProvider trackingURLProvider) throws IOException {
+      final TrackingURLProvider trackingURLProvider,
+      final RackNameFormatter rackNameFormatter) throws IOException {
 
     this.reefEventHandlers = reefEventHandlers;
     this.driverStatusManager = driverStatusManager;
@@ -95,6 +97,7 @@ final class YarnContainerManager
     this.containerRequestCounter = containerRequestCounter;
     this.yarnConf = yarnConf;
     this.trackingURLProvider = trackingURLProvider;
+    this.rackNameFormatter = rackNameFormatter;
 
 
     this.yarnClient.init(this.yarnConf);
@@ -104,6 +107,7 @@ final class YarnContainerManager
     LOG.log(Level.FINEST, "Instantiated YarnContainerManager");
   }
 
+
   @Override
   public void onContainersCompleted(final List<ContainerStatus> 
containerStatuses) {
     for (final ContainerStatus containerStatus : containerStatuses) {
@@ -402,20 +406,6 @@ final class YarnContainerManager
         this.requestsAfterSentToRM.remove();
         doHomogeneousRequests();
 
-        // the rack name comes as part of the host name, e.g.
-        // <rackName>-<hostNumber>
-        // we perform some checks just in case it doesn't
-        final String hostName = container.getNodeId().getHost();
-        String rackName = null;
-        if (hostName != null) {
-          final String[] rackNameAndNumber = hostName.split("-");
-          if (rackNameAndNumber.length == 2) {
-            rackName = rackNameAndNumber[0];
-          } else {
-            LOG.log(Level.WARNING, "Could not get information from the rack 
name, should use the default");
-          }
-        }
-
         LOG.log(Level.FINEST, "Allocated Container: memory = {0}, core number 
= {1}",
             new Object[]{container.getResource().getMemory(), 
container.getResource().getVirtualCores()});
         
this.reefEventHandlers.onResourceAllocation(ResourceAllocationEventImpl.newBuilder()
@@ -423,7 +413,7 @@ final class YarnContainerManager
             .setNodeId(container.getNodeId().toString())
             .setResourceMemory(container.getResource().getMemory())
             .setVirtualCores(container.getResource().getVirtualCores())
-            .setRackName(rackName)
+            .setRackName(rackNameFormatter.getRackName(container))
             .build());
         this.updateRuntimeStatus();
       } else {

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/a4c78c4a/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/YarnDriverConfiguration.java
----------------------------------------------------------------------
diff --git 
a/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/YarnDriverConfiguration.java
 
b/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/YarnDriverConfiguration.java
index abe5c7d..e3cade9 100644
--- 
a/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/YarnDriverConfiguration.java
+++ 
b/lang/java/reef-runtime-yarn/src/main/java/org/apache/reef/runtime/yarn/driver/YarnDriverConfiguration.java
@@ -33,10 +33,7 @@ import org.apache.reef.runtime.yarn.YarnClasspathProvider;
 import org.apache.reef.runtime.yarn.driver.parameters.JobSubmissionDirectory;
 import org.apache.reef.runtime.yarn.driver.parameters.YarnHeartbeatPeriod;
 import org.apache.reef.runtime.yarn.util.YarnConfigurationConstructor;
-import org.apache.reef.tang.formats.ConfigurationModule;
-import org.apache.reef.tang.formats.ConfigurationModuleBuilder;
-import org.apache.reef.tang.formats.OptionalParameter;
-import org.apache.reef.tang.formats.RequiredParameter;
+import org.apache.reef.tang.formats.*;
 
 /**
  * Created by marku_000 on 2014-07-07.
@@ -57,6 +54,11 @@ public class YarnDriverConfiguration extends 
ConfigurationModuleBuilder {
   public static final RequiredParameter<String> JOB_IDENTIFIER = new 
RequiredParameter<>();
 
   /**
+   * @see {@link RackNameFormatter}
+   */
+  public static final OptionalImpl<RackNameFormatter> RACK_NAME_FORMATTER = 
new OptionalImpl<>();
+
+  /**
    * @see EvaluatorTimeout
    */
   public static final OptionalParameter<Long> EVALUATOR_TIMEOUT = new 
OptionalParameter<>();
@@ -93,6 +95,7 @@ public class YarnDriverConfiguration extends 
ConfigurationModuleBuilder {
       .bindNamedParameter(ClientRemoteIdentifier.class, 
CLIENT_REMOTE_IDENTIFIER)
       .bindNamedParameter(ErrorHandlerRID.class, CLIENT_REMOTE_IDENTIFIER)
       .bindNamedParameter(JVMHeapSlack.class, JVM_HEAP_SLACK)
+      .bindImplementation(RackNameFormatter.class, RACK_NAME_FORMATTER)
       .bindImplementation(RuntimeClasspathProvider.class, 
YarnClasspathProvider.class)
       .build();
 }

Reply via email to