You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2014/12/17 19:58:00 UTC
ambari git commit: AMBARI-8724. Rolling Upgrade - Upgrade Pack to
restart standby ResourceManager first, failover,
and then upgrade the remaining RM (ncole)
Repository: ambari
Updated Branches:
refs/heads/trunk d03662aed -> 7f3b8e9f6
AMBARI-8724. Rolling Upgrade - Upgrade Pack to restart standby ResourceManager first, failover, and then upgrade the remaining RM (ncole)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/7f3b8e9f
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/7f3b8e9f
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/7f3b8e9f
Branch: refs/heads/trunk
Commit: 7f3b8e9f66d6eb3dba88c31c3f9561db6ea18c24
Parents: d03662a
Author: Nate Cole <nc...@hortonworks.com>
Authored: Tue Dec 16 17:07:04 2014 -0500
Committer: Nate Cole <nc...@hortonworks.com>
Committed: Wed Dec 17 13:57:32 2014 -0500
----------------------------------------------------------------------
.../ambari/server/stack/MasterHostResolver.java | 156 +++++++++++++------
.../ambari/server/state/UpgradeHelper.java | 27 ++--
.../state/stack/upgrade/ClusterGrouping.java | 30 ++--
.../state/stack/upgrade/ColocatedGrouping.java | 15 +-
.../stacks/HDP/2.2/upgrades/upgrade-2.2.xml | 17 +-
.../ambari/server/state/UpgradeHelperTest.java | 57 +++++--
6 files changed, 201 insertions(+), 101 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/7f3b8e9f/ambari-server/src/main/java/org/apache/ambari/server/stack/MasterHostResolver.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/MasterHostResolver.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/MasterHostResolver.java
index 3baf187..b453362 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/MasterHostResolver.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/MasterHostResolver.java
@@ -18,21 +18,21 @@
package org.apache.ambari.server.stack;
-import com.google.common.reflect.TypeToken;
-import org.apache.ambari.server.state.Cluster;
-import org.apache.ambari.server.utils.HTTPUtils;
-
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.Iterator;
+import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.utils.HTTPUtils;
import org.apache.ambari.server.utils.StageUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.reflect.TypeToken;
+
public class MasterHostResolver {
@@ -42,7 +42,8 @@ public class MasterHostResolver {
enum Service {
HDFS,
- HBASE
+ HBASE,
+ YARN
}
/**
@@ -53,10 +54,6 @@ public class MasterHostResolver {
STANDBY
}
- public MasterHostResolver() {
- ;
- }
-
public MasterHostResolver(Cluster cluster) {
this.cluster = cluster;
}
@@ -74,15 +71,21 @@ public class MasterHostResolver {
return null;
}
- Service s = Service.valueOf(serviceName.toUpperCase());
-
Set<String> componentHosts = cluster.getHosts(serviceName, componentName);
if (0 == componentHosts.size()) {
return null;
}
-
+
hostsType.hosts = componentHosts;
+ Service s = null;
+ try {
+ s = Service.valueOf(serviceName.toUpperCase());
+ } catch (Exception e) {
+ // !!! nothing to do
+ return hostsType;
+ }
+
switch (s) {
case HDFS:
if (componentName.equalsIgnoreCase("NAMENODE")) {
@@ -90,13 +93,19 @@ public class MasterHostResolver {
if (pair != null) {
hostsType.master = pair.containsKey(Status.ACTIVE) ? pair.get(Status.ACTIVE) : null;
hostsType.secondary = pair.containsKey(Status.STANDBY) ? pair.get(Status.STANDBY) : null;
+ } else {
+ hostsType.master = componentHosts.iterator().next();
}
}
break;
+ case YARN:
+ if (componentName.equalsIgnoreCase("RESOURCEMANAGER")) {
+ resolveResourceManagers(hostsType);
+ }
+ break;
case HBASE:
- if (componentName.equalsIgnoreCase("HBASE_REGIONSERVER")) {
- // TODO Rolling Upgrade, fill for this Component.
- ;
+ if (componentName.equalsIgnoreCase("HBASE_MASTER")) {
+ resolveHBaseMasters(hostsType);
}
break;
}
@@ -110,42 +119,20 @@ public class MasterHostResolver {
*/
private Map<Status, String> getNameNodePair(Set<String> hosts) {
Map<Status, String> stateToHost = new HashMap<Status, String>();
+
if (hosts != null && hosts.size() == 2) {
- Iterator iter = hosts.iterator();
-
- while(iter.hasNext()) {
- String hostname = (String) iter.next();
- try {
- // TODO Rolling Upgrade, don't hardcode jmx port number
- // E.g.,
- // dfs.namenode.http-address.dev.nn1 : c6401.ambari.apache.org:50070
- // dfs.namenode.http-address.dev.nn2 : c6402.ambari.apache.org:50070
- String endpoint = "http://" + hostname + ":50070/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus";
- String response = HTTPUtils.requestURL(endpoint);
-
- if (response != null && !response.isEmpty()) {
- Map<String, ArrayList<HashMap<String, String>>> nameNodeInfo = new HashMap<String, ArrayList<HashMap<String, String>>>();
- Type type = new TypeToken<Map<String, ArrayList<HashMap<String, String>>>>() {}.getType();
- nameNodeInfo = StageUtils.getGson().fromJson(response, type);
-
- try {
- String state = nameNodeInfo.get("beans").get(0).get("State");
-
- if (state.equalsIgnoreCase(Status.ACTIVE.toString()) || state.equalsIgnoreCase(Status.STANDBY.toString())) {
- Status status = Status.valueOf(state.toUpperCase());
- stateToHost.put(status, hostname);
- }
- } catch (Exception e) {
- throw new Exception("Response from endpoint " + endpoint + " was not formatted correctly. Value: " + response);
- }
- } else {
- throw new Exception("Response from endpoint " + endpoint + " was empty.");
+ for (String hostname : hosts) {
+ String state = queryJmxBeanValue(hostname, 50070,
+ "Hadoop:service=NameNode,name=NameNodeStatus", "State", true);
+
+ if (null != state &&
+ (state.equalsIgnoreCase(Status.ACTIVE.toString()) ||
+ state.equalsIgnoreCase(Status.STANDBY.toString()))) {
+ Status status = Status.valueOf(state.toUpperCase());
+ stateToHost.put(status, hostname);
}
- } catch (Exception e) {
- LOG.warn("Failed to parse namenode jmx endpoint to get state for host " + hostname + ". Error: " + e.getMessage());
}
- }
-
+
if (stateToHost.containsKey(Status.ACTIVE) && stateToHost.containsKey(Status.STANDBY) && !stateToHost.get(Status.ACTIVE).equalsIgnoreCase(stateToHost.get(Status.STANDBY))) {
return stateToHost;
}
@@ -153,4 +140,75 @@ public class MasterHostResolver {
return null;
}
+
+ private void resolveResourceManagers(HostsType hostType) {
+ // !!! for RM, only the master returns jmx
+ Set<String> orderedHosts = new LinkedHashSet<String>(hostType.hosts);
+
+ for (String hostname : hostType.hosts) {
+
+ String value = queryJmxBeanValue(hostname, 8088,
+ "Hadoop:service=ResourceManager,name=RMNMInfo", "modelerType", true);
+
+ if (null != value) {
+ if (null == hostType.master) {
+ hostType.master = hostname;
+ }
+
+ // !!! quick and dirty to make sure the master is last in the list
+ orderedHosts.remove(hostname);
+ orderedHosts.add(hostname);
+ }
+
+ }
+ hostType.hosts = orderedHosts;
+ }
+
+ private void resolveHBaseMasters(HostsType hostsType) {
+
+ for (String hostname : hostsType.hosts) {
+
+ String value = queryJmxBeanValue(hostname, 60010,
+ "Hadoop:service=HBase,name=Master,sub=Server", "tag.isActiveMaster", false);
+
+ if (null != value) {
+ Boolean bool = Boolean.valueOf(value);
+ if (bool.booleanValue()) {
+ hostsType.master = hostname;
+ } else {
+ hostsType.secondary = hostname;
+ }
+ }
+
+ }
+ }
+
+ private String queryJmxBeanValue(String hostname, int port, String beanName, String attributeName,
+ boolean asQuery) {
+
+ String endPoint = asQuery ?
+ String.format("http://%s:%s/jmx?qry=%s", hostname, port, beanName) :
+ String.format("http://%s:%s/jmx?get=%s::%s", hostname, port, beanName, attributeName);
+
+ String response = HTTPUtils.requestURL(endPoint);
+
+ if (null == response || response.isEmpty()) {
+ return null;
+ }
+
+ Type type = new TypeToken<Map<String, ArrayList<HashMap<String, String>>>>() {}.getType();
+
+ try {
+ Map<String, ArrayList<HashMap<String, String>>> jmxBeans =
+ StageUtils.getGson().fromJson(response, type);
+
+ return jmxBeans.get("beans").get(0).get(attributeName);
+ } catch (Exception e) {
+ LOG.info("Could not load JMX from {}/{} from {}", beanName, attributeName, hostname, e);
+ }
+
+ return null;
+
+ }
+
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/7f3b8e9f/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java
index d7c09ea..b450eeb 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeHelper.java
@@ -100,19 +100,17 @@ public class UpgradeHelper {
continue;
}
- Set<String> componentHosts = cluster.getHosts(service.serviceName, component);
- if (0 == componentHosts.size()) {
+ HostsType hostsType = mhr.getMasterAndHosts(service.serviceName, component);
+ if (null == hostsType) {
continue;
}
- HostsType hostsType = new HostsType();
- hostsType.hosts = componentHosts;
-
+
ProcessingComponent pc = allTasks.get(service.serviceName).get(component);
-
+
// Special case for NAMENODE
if (service.serviceName.equalsIgnoreCase("HDFS") && component.equalsIgnoreCase("NAMENODE")) {
- hostsType = mhr.getMasterAndHosts(service.serviceName, component);
- if (hostsType != null && hostsType.master != null && componentHosts.contains(hostsType.master) && hostsType.secondary != null && componentHosts.contains(hostsType.secondary)) {
+ // !!! revisit if needed
+ if (hostsType.master != null && hostsType.secondary != null) {
// The order is important, first do the standby, then the active namenode.
Set<String> order = new LinkedHashSet<String>();
@@ -122,15 +120,14 @@ public class UpgradeHelper {
// Override the hosts with the ordered collection
hostsType.hosts = order;
- builder.add(hostsType, service.serviceName, pc);
+
} else {
- throw new AmbariException(MessageFormat.format("Could not find active and standby namenodes using hosts: {0}", StringUtils.join(componentHosts, ", ").toString()));
+// throw new AmbariException(MessageFormat.format("Could not find active and standby namenodes using hosts: {0}", StringUtils.join(hostsType.hosts, ", ").toString()));
}
- }
- /*
- TODO Rolling Upgrade, write logic for HBASE
- */
- else {
+
+ builder.add(hostsType, service.serviceName, pc);
+
+ } else {
builder.add(hostsType, service.serviceName, pc);
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/7f3b8e9f/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
index 77e9922..da784c3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
@@ -19,6 +19,7 @@ package org.apache.ambari.server.state.stack.upgrade;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@@ -31,10 +32,8 @@ import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;
import org.apache.ambari.server.stack.HostsType;
+import org.apache.ambari.server.stack.MasterHostResolver;
import org.apache.ambari.server.state.Cluster;
-import org.apache.ambari.server.state.UpgradeHelper;
-import org.apache.ambari.server.state.cluster.ClusterImpl;
-import org.apache.ambari.server.state.stack.UpgradePack;
import org.apache.ambari.server.state.stack.UpgradePack.ProcessingComponent;
/**
@@ -73,13 +72,13 @@ public class ClusterGrouping extends Grouping {
}
public class ClusterBuilder extends StageWrapperBuilder {
- private Cluster m_cluster = null;
+ private MasterHostResolver m_resolver = null;
/**
* @param cluster the cluster to use with this builder
*/
public void setHelpers(Cluster cluster) {
- m_cluster = cluster;
+ m_resolver = new MasterHostResolver(cluster);
}
@Override
@@ -101,15 +100,28 @@ public class ClusterGrouping extends Grouping {
StageWrapper wrapper = null;
if (null != execution.service && null != execution.component) {
- Set<String> hosts = m_cluster.getHosts(execution.service, execution.component);
+
+ HostsType hosts = m_resolver.getMasterAndHosts(execution.service, execution.component);
+
+ if (null == hosts) {
+ continue;
+ }
+
+ Set<String> realHosts = new LinkedHashSet<String>(hosts.hosts);
+
// !!! FIXME other types
- if (hosts.size() > 0 && task.getType() == Task.Type.EXECUTE) {
+ if (task.getType() == Task.Type.EXECUTE) {
+ ExecuteTask et = (ExecuteTask) task;
+
+ if (null != et.hosts && "master".equals(et.hosts) && null != hosts.master) {
+ realHosts = Collections.singleton(hosts.master);
+ }
+
wrapper = new StageWrapper(
StageWrapper.Type.RU_TASKS,
execution.title,
- new TaskWrapper(execution.service, execution.component, hosts, task));
+ new TaskWrapper(execution.service, execution.component, realHosts, task));
}
-
} else {
switch (task.getType()) {
case MANUAL:
http://git-wip-us.apache.org/repos/asf/ambari/blob/7f3b8e9f/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
index cc8b57b..0e25c70 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ColocatedGrouping.java
@@ -130,7 +130,7 @@ public class ColocatedGrouping extends Grouping {
LOG.debug("RU initial: {}", initialBatch);
LOG.debug("RU final: {}", finalBatches);
}
-
+
results.addAll(fromProxies(initialBatch));
// !!! TODO when manual tasks are ready
@@ -157,7 +157,7 @@ public class ColocatedGrouping extends Grouping {
// !!! stage per host, per type
StageWrapper wrapper = null;
- StageWrapper execwrapper = null;
+ List<StageWrapper> execwrappers = new ArrayList<StageWrapper>();
for (TaskProxy t : entry.getValue()) {
serviceChecks.add(t.service);
@@ -167,19 +167,18 @@ public class ColocatedGrouping extends Grouping {
wrapper = new StageWrapper(StageWrapper.Type.RU_TASKS, t.message, t.getTasksArray());
}
} else {
- if (null == execwrapper) {
- execwrapper = new StageWrapper(StageWrapper.Type.RESTART, t.message, t.getTasksArray());
- }
+ execwrappers.add(new StageWrapper(StageWrapper.Type.RESTART, t.message, t.getTasksArray()));
}
}
if (null != wrapper) {
results.add(wrapper);
}
-
- if (null != execwrapper) {
- results.add(execwrapper);
+
+ if (execwrappers.size() > 0) {
+ results.addAll(execwrappers);
}
+
}
if (serviceChecks.size() > 0) {
http://git-wip-us.apache.org/repos/asf/ambari/blob/7f3b8e9f/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml
index 285e876..b86aa45 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.2.xml
@@ -31,8 +31,8 @@
<upgrade xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<target>2.2.*.*</target>
- <order>
+ <order>
<group name="ZOOKEEPER" title="Zookeeper">
<service name="ZOOKEEPER">
<component>ZOOKEEPER_SERVER</component>
@@ -54,6 +54,7 @@
<component>APP_TIMELINE_SERVER</component>
<component>RESOURCEMANAGER</component>
</service>
+
<service name="HBASE">
<component>HBASE_MASTER</component>
</service>
@@ -63,7 +64,7 @@
<service name="HDFS">
<component>DATANODE</component>
</service>
-
+
<service name="HBASE">
<component>HBASE_REGIONSERVER</component>
</service>
@@ -78,20 +79,22 @@
</batch>
</group>
- <!--
<group xsi:type="cluster" name="POST_CLUSTER" title="Finalize Upgrade">
+ <!--
<execute-stage title="Confirm Finalize">
<task xsi:type="manual">
<message>Please confirm you are ready to finalize</message>
</task>
</execute-stage>
+ -->
<execute-stage service="HDFS" component="NAMENODE" title="Execute HDFS Finalize">
- <task xsi:type="execute">
- <command>ls</command>
+ <task xsi:type="execute" hosts="master">
+ <first>su - {{hadoop-env/hdfs_user}} -c 'hdfs dfsadmin -rollingUpgrade finalize'</first>
+ <command>su - {{hadoop-env/hdfs_user}} -c 'hdfs dfsadmin -safemode leave'</command>
</task>
</execute-stage>
</group>
- -->
+
</order>
@@ -242,7 +245,7 @@
<service name="HBASE">
<component name="HBASE_MASTER">
<pre-upgrade>
- <task xsi:type="execute">
+ <task xsi:type="execute" hosts="master">
<command>su - {{hbase-env/hbase_user}} -c 'echo "snapshot_all" | hbase shell'</command>
</task>
</pre-upgrade>
http://git-wip-us.apache.org/repos/asf/ambari/blob/7f3b8e9f/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
index c3652e3..198191b 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
@@ -17,11 +17,15 @@
*/
package org.apache.ambari.server.state;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -34,17 +38,16 @@ import org.apache.ambari.server.stack.HostsType;
import org.apache.ambari.server.stack.MasterHostResolver;
import org.apache.ambari.server.state.UpgradeHelper.UpgradeGroupHolder;
import org.apache.ambari.server.state.stack.UpgradePack;
+import org.easymock.EasyMock;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mockito;
+import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.persist.PersistService;
-import org.mockito.Mockito;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
/**
* Tests the {@link UpgradeHelper} class
@@ -65,8 +68,8 @@ public class UpgradeHelperTest {
helper = injector.getInstance(OrmTestHelper.class);
ambariMetaInfo = injector.getInstance(AmbariMetaInfo.class);
ambariMetaInfo.init();
-
- m_masterHostResolver = mock(MasterHostResolver.class);
+
+ m_masterHostResolver = EasyMock.createMock(MasterHostResolver.class);
}
@After
@@ -86,15 +89,12 @@ public class UpgradeHelperTest {
Cluster cluster = makeCluster();
- HostsType hostsType = new HostsType();
- hostsType.hosts = cluster.getHosts("HDFS", "NAMENODE");
- hostsType.master = "h1";
- hostsType.secondary = "h2";
- when(m_masterHostResolver.getMasterAndHosts(Mockito.matches("HDFS"), Mockito.matches("NAMENODE"))).thenReturn(hostsType);
-
+
UpgradeHelper helper = new UpgradeHelper();
List<UpgradeGroupHolder> groups = helper.createUpgrade(cluster, m_masterHostResolver, upgrade);
+
+
assertEquals(5, groups.size());
assertEquals("PRE_CLUSTER", groups.get(0).name);
@@ -167,8 +167,39 @@ public class UpgradeHelperTest {
sc.addServiceComponentHost("h1");
sc.addServiceComponentHost("h3");
- return c;
+ HostsType type = new HostsType();
+ type.hosts = new HashSet<String>(Arrays.asList("h1", "h2", "h3"));
+ expect(m_masterHostResolver.getMasterAndHosts("ZOOKEEPER", "ZOOKEEPER_SERVER")).andReturn(type).anyTimes();
+
+ type = new HostsType();
+ type.hosts = new HashSet<String>(Arrays.asList("h1", "h2"));
+ type.master = "h1";
+ type.secondary = "h2";
+ expect(m_masterHostResolver.getMasterAndHosts("HDFS", "NAMENODE")).andReturn(type).anyTimes();
+
+ type = new HostsType();
+ type.hosts = new HashSet<String>(Arrays.asList("h2", "h3"));
+ expect(m_masterHostResolver.getMasterAndHosts("HDFS", "DATANODE")).andReturn(type).anyTimes();
+
+ type = new HostsType();
+ type.hosts = new HashSet<String>(Arrays.asList("h2"));
+ expect(m_masterHostResolver.getMasterAndHosts("YARN", "RESOURCEMANAGER")).andReturn(type).anyTimes();
+
+ type = new HostsType();
+ type.hosts = new HashSet<String>(Arrays.asList("h1", "h3"));
+ expect(m_masterHostResolver.getMasterAndHosts("YARN", "NODEMANAGER")).andReturn(type).anyTimes();
+
+
+ replay(m_masterHostResolver);
+ return c;
+ }
+
+
+ private static class MockModule extends AbstractModule {
+ protected void configure() {
+
+ }
}
}