Skip to content

Commit e2140c7

Browse files
author
Xin Gao
committed
YARN-11391 Fix Jenkins reported issue
1 parent e897e65 commit e2140c7

4 files changed

Lines changed: 73 additions & 47 deletions

File tree

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/HAUtil.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ public static Collection<String> getRMHAIds(Configuration conf) {
267267

268268
/**
269269
* Instead of returning RM_HA_IDS in current configurations, it
270-
* would return the originally preset one in case of DNS resolving
270+
* would return the originally preset one in case of DNS resolving.
271271
* @param conf Configuration.
272272
* @return RM Ids from original xml file
273273
*/
@@ -343,7 +343,8 @@ public static Map<String, InetSocketAddress> getResolvedRMIdPairs(
343343
// this function would only return value which is corresponded to YarnConfiguration.RM_ADDRESS
344344
Map<String, InetSocketAddress> ret = null;
345345
for (List<String> configKeys : addressesConfigKeysMap.values()) {
346-
Map<String, InetSocketAddress> res = getResolvedIdPairs(conf, resolveNeeded, requireFQDN, getOriginalRMHAIds(conf),
346+
Map<String, InetSocketAddress> res = getResolvedIdPairs(
347+
conf, resolveNeeded, requireFQDN, getOriginalRMHAIds(conf),
347348
configKeys.get(0), YarnConfiguration.RM_HA_IDS, configKeys);
348349
if (configKeys.contains(YarnConfiguration.RM_ADDRESS)) {
349350
ret = res;

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/client/ConfiguredRMFailoverProxyProvider.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import java.io.Closeable;
2222
import java.io.IOException;
2323
import java.net.InetSocketAddress;
24-
import java.util.ArrayList;
2524
import java.util.Collection;
2625
import java.util.HashMap;
2726
import java.util.Map;

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,40 @@
677677
<value>org.apache.hadoop.net.DNSDomainNameResolver</value>
678678
</property>
679679

680+
<property>
681+
<description>
682+
Determines if the given resourcemanager address is a domain name which needs to
683+
be resolved (using the resolver configured by yarn.resourcemanager.ha.resolver.impl).
684+
This adds a transparency layer in the client so physical server address
685+
can change without changing the client.
686+
</description>
687+
<name>yarn.resourcemanager.ha.resolve-needed</name>
688+
<value>false</value>
689+
</property>
690+
691+
<property>
692+
<description>
693+
The amount of milliseconds between DNS address re-resolving.
694+
By default, this parameter is set to -1 which disabled the DNS auto-refresh functionality.
695+
Enabling the auto-refresh would help long running sessions (including node managers) able to
696+
find the replaced resource managers (e.g. during node replacement/migration) without downtime.
697+
</description>
698+
<name>yarn.resourcemanager.ha.refresh-period-ms</name>
699+
<value>-1</value>
700+
</property>
701+
702+
<property>
703+
<description>
704+
Determines whether the resolved result is fully qualified domain name instead
705+
of pure IP address(es).
706+
In secure environment, this has to be enabled since Kerberos is using fqdn
707+
in machine's principal therefore accessing servers by IP won't be recognized
708+
by the KDC.
709+
</description>
710+
<name>yarn.resourcemanager.ha.resolver.useFQDN</name>
711+
<value>true</value>
712+
</property>
713+
680714
<property>
681715
<description>Enable automatic failover.
682716
By default, it is enabled only when HA is enabled</description>

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/client/TestConfiguredRMFailoverProxyProvider.java

Lines changed: 36 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import static org.mockito.Mockito.mock;
4444

4545
public class TestConfiguredRMFailoverProxyProvider {
46-
private Configuration conf;
4746
private final static List<String> HOST_LIST = Arrays.asList(
4847
"host01",
4948
"host02",
@@ -62,28 +61,16 @@ public class TestConfiguredRMFailoverProxyProvider {
6261
private final static String MULTI_A_RM_SCHEDULER_ADDRESS = "rmscheduler.com";
6362
private final static long REFRESH_TIME_INTERVAL = 1000; // unit ms
6463

65-
ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol> proxyProvider;
66-
67-
@Before
68-
public void testInit() {
69-
conf = new Configuration();
70-
conf.set(YarnConfiguration.RM_HA_IDS, "rm1,rm2");
71-
RMProxy rm1Mock = mock(RMProxy.class);
72-
doNothing().when(rm1Mock).checkAllowedProtocols(ApplicationClientProtocol.class);
73-
proxyProvider = new ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol>();
74-
proxyProvider.init(conf, rm1Mock, ApplicationClientProtocol.class);
75-
}
76-
7764
public Configuration getDNSConfig() {
7865
Configuration dnsConf = new Configuration();
7966
dnsConf.set(YarnConfiguration.RESOLVE_RM_ADDRESS_KEY, MockDomainNameResolver.class.getName());
8067
dnsConf.set(YarnConfiguration.RM_HA_IDS, MULTI_A_RM_ID);
81-
dnsConf.set(HAUtil.addSuffix(YarnConfiguration.RM_ADDRESS, MULTI_A_RM_ID), MULTI_A_RM_ADDRESS +
82-
":" + YarnConfiguration.DEFAULT_RM_PORT);
83-
dnsConf.set(HAUtil.addSuffix(YarnConfiguration.RM_ADMIN_ADDRESS, MULTI_A_RM_ID), MULTI_A_RM_ADDRESS +
84-
":" + YarnConfiguration.DEFAULT_RM_ADMIN_PORT);
85-
dnsConf.set(HAUtil.addSuffix(YarnConfiguration.RM_SCHEDULER_ADDRESS, MULTI_A_RM_ID), MULTI_A_RM_SCHEDULER_ADDRESS +
86-
":" + YarnConfiguration.DEFAULT_RM_SCHEDULER_PORT);
68+
dnsConf.set(HAUtil.addSuffix(YarnConfiguration.RM_ADDRESS, MULTI_A_RM_ID),
69+
MULTI_A_RM_ADDRESS + ":" + YarnConfiguration.DEFAULT_RM_PORT);
70+
dnsConf.set(HAUtil.addSuffix(YarnConfiguration.RM_ADMIN_ADDRESS, MULTI_A_RM_ID),
71+
MULTI_A_RM_ADDRESS + ":" + YarnConfiguration.DEFAULT_RM_ADMIN_PORT);
72+
dnsConf.set(HAUtil.addSuffix(YarnConfiguration.RM_SCHEDULER_ADDRESS, MULTI_A_RM_ID),
73+
MULTI_A_RM_SCHEDULER_ADDRESS + ":" + YarnConfiguration.DEFAULT_RM_SCHEDULER_PORT);
8774
dnsConf.setBoolean(YarnConfiguration.RESOLVE_RM_ADDRESS_NEEDED_KEY, true);
8875
dnsConf.setBoolean(YarnConfiguration.RESOLVE_RM_ADDRESS_TO_FQDN, true);
8976
return dnsConf;
@@ -121,39 +108,44 @@ private void overrideDNSMapping(int excludeIdx) throws UnknownHostException {
121108
((MockDomainNameResolver)HAUtil.getDnr()).setPtrMap(ptrMap);
122109
}
123110

124-
@Test(expected = IllegalStateException.class)
125-
public void testInitWithNoInstances() {
126-
Configuration conf = new Configuration();;
111+
@SuppressWarnings("unchecked") // mock generics
112+
private void initProxyProvider(
113+
Configuration conf,
114+
ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol> proxyProvider) {
127115
RMProxy rm1Mock = mock(RMProxy.class);
128116
doNothing().when(rm1Mock).checkAllowedProtocols(ApplicationClientProtocol.class);
129-
ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol> proxyProviderWithNoInstances = new ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol>();
130-
proxyProviderWithNoInstances.init(conf, rm1Mock, ApplicationClientProtocol.class);
117+
proxyProvider.init(conf, rm1Mock, ApplicationClientProtocol.class);
118+
}
119+
120+
@Test(expected = IllegalStateException.class)
121+
public void testInitWithNoInstances() {
122+
Configuration conf = new Configuration();
123+
ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol> proxyProviderWithNoInstances =
124+
new ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol>();
125+
initProxyProvider(conf, proxyProviderWithNoInstances);
131126
}
132127

133128
@Test
134129
public void testGetProxy() {
135-
FailoverProxyProvider.ProxyInfo<ApplicationClientProtocol> proxy = proxyProvider.getProxy();
136130
Configuration conf = new Configuration();
137131
conf.set(YarnConfiguration.RM_HA_IDS, "rm1,rm2,rm3,rm4");
138-
RMProxy rm1Mock = mock(RMProxy.class);
139-
doNothing().when(rm1Mock).checkAllowedProtocols(ApplicationClientProtocol.class);
140-
ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol> proxyProviderWithNoInstances = new ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol>();
141-
proxyProviderWithNoInstances.init(conf, rm1Mock, ApplicationClientProtocol.class);
142-
assertEquals(proxyProviderWithNoInstances.rmServiceIds[0], "rm1");
143-
FailoverProxyProvider.ProxyInfo<ApplicationClientProtocol> current = proxyProviderWithNoInstances.getProxy();
132+
ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol> proxyProvider =
133+
new ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol>();
134+
initProxyProvider(conf, proxyProvider);
135+
assertEquals(proxyProvider.rmServiceIds[0], "rm1");
136+
FailoverProxyProvider.ProxyInfo<ApplicationClientProtocol> current =
137+
proxyProvider.getProxy();
144138
assertEquals(current.proxyInfo, "rm1");
145139
}
146140

147141
@Test
148142
public void testInitWithMultiARecordRM() throws UnknownHostException {
149143
Configuration conf = getDNSConfig();
150-
RMProxy rm1Mock = mock(RMProxy.class);
151-
doNothing().when(rm1Mock).checkAllowedProtocols(ApplicationClientProtocol.class);
152144
ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol> proxyProviderWithmultiA =
153145
new ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol>();
154146
HAUtil.setDnrByConfiguration(conf);
155147
overrideDNSMapping(1);
156-
proxyProviderWithmultiA.init(conf, rm1Mock, ApplicationClientProtocol.class);
148+
initProxyProvider(conf, proxyProviderWithmultiA);
157149
assertEquals(HOST_LIST.size() - 1, proxyProviderWithmultiA.rmServiceIds.length);
158150
for (String rmId : proxyProviderWithmultiA.rmServiceIds) {
159151
assertTrue(rmId.startsWith("rm_resolved_"));
@@ -163,19 +155,19 @@ public void testInitWithMultiARecordRM() throws UnknownHostException {
163155
@Test
164156
public void testResolveDifferentMultiARecordRM() throws UnknownHostException {
165157
Configuration conf = getDNSConfig();
166-
RMProxy rm1Mock = mock(RMProxy.class);
167-
doNothing().when(rm1Mock).checkAllowedProtocols(ApplicationClientProtocol.class);
168158
ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol> proxyProviderWithmultiA =
169159
new ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol>();
170160
HAUtil.setDnrByConfiguration(conf);
171161
overrideDNSMapping(1);
172-
proxyProviderWithmultiA.init(conf, rm1Mock, ApplicationClientProtocol.class);
162+
initProxyProvider(conf, proxyProviderWithmultiA);
173163
List<String> rmAddresses = getRMAddresses(proxyProviderWithmultiA.conf,
174164
proxyProviderWithmultiA.rmServiceIds,
175165
YarnConfiguration.RM_ADDRESS);
176-
List<String> rmAdminAddresses = getRMAddresses(proxyProviderWithmultiA.conf, proxyProviderWithmultiA.rmServiceIds,
166+
List<String> rmAdminAddresses = getRMAddresses(proxyProviderWithmultiA.conf,
167+
proxyProviderWithmultiA.rmServiceIds,
177168
YarnConfiguration.RM_ADMIN_ADDRESS);
178-
List<String> rmSchedulerAddresses = getRMAddresses(proxyProviderWithmultiA.conf, proxyProviderWithmultiA.rmServiceIds,
169+
List<String> rmSchedulerAddresses = getRMAddresses(proxyProviderWithmultiA.conf,
170+
proxyProviderWithmultiA.rmServiceIds,
179171
YarnConfiguration.RM_SCHEDULER_ADDRESS);
180172
assertEquals(HOST_LIST.size() - 1, rmAddresses.size());
181173
assertEquals(HOST_LIST.size() - 1, rmAdminAddresses.size());
@@ -187,18 +179,17 @@ public void testResolveDifferentMultiARecordRM() throws UnknownHostException {
187179
public void testRefreshWithMultiARecordRM() throws UnknownHostException, InterruptedException {
188180
Configuration conf = getDNSConfig();
189181
conf.setLong(YarnConfiguration.RM_ID_REFRESH_INTERVAL, REFRESH_TIME_INTERVAL);
190-
RMProxy rm1Mock = mock(RMProxy.class);
191-
doNothing().when(rm1Mock).checkAllowedProtocols(ApplicationClientProtocol.class);
192182
ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol> proxyProviderWithmultiA =
193183
new ConfiguredRMFailoverProxyProvider<ApplicationClientProtocol>();
194184
HAUtil.setDnrByConfiguration(conf);
195185
overrideDNSMapping(0);
196-
proxyProviderWithmultiA.init(conf, rm1Mock, ApplicationClientProtocol.class);
186+
initProxyProvider(conf, proxyProviderWithmultiA);
197187
InetSocketAddress oldActiveRMAddress =
198188
conf.getSocketAddr(HAUtil.addSuffix(YarnConfiguration.RM_ADDRESS, HAUtil.getRMHAId(conf)),
199189
YarnConfiguration.DEFAULT_RM_ADDRESS,
200190
YarnConfiguration.DEFAULT_RM_PORT);
201-
List<String> oldRMAddresses = getRMAddresses(conf, proxyProviderWithmultiA.rmServiceIds, YarnConfiguration.RM_ADDRESS);
191+
List<String> oldRMAddresses = getRMAddresses(
192+
conf, proxyProviderWithmultiA.rmServiceIds, YarnConfiguration.RM_ADDRESS);
202193
for (String address : oldRMAddresses) {
203194
assertTrue(!address.equals(HOST_LIST.get(0)));
204195
}
@@ -209,7 +200,8 @@ public void testRefreshWithMultiARecordRM() throws UnknownHostException, Interru
209200
conf.getSocketAddr(HAUtil.addSuffix(YarnConfiguration.RM_ADDRESS, HAUtil.getRMHAId(conf)),
210201
YarnConfiguration.DEFAULT_RM_ADDRESS,
211202
YarnConfiguration.DEFAULT_RM_PORT);
212-
List<String> newRMAddresses = getRMAddresses(conf, proxyProviderWithmultiA.rmServiceIds, YarnConfiguration.RM_ADDRESS);
203+
List<String> newRMAddresses = getRMAddresses(
204+
conf, proxyProviderWithmultiA.rmServiceIds, YarnConfiguration.RM_ADDRESS);
213205
assertEquals(HOST_LIST.size() - 1, newRMAddresses.size());
214206
// active RM should remain same, even without failover
215207
assertEquals(oldActiveRMAddress, newActiveRMAddress);

0 commit comments

Comments
 (0)