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(); }
