HDFS-3414. Balancer does not find NameNode if rpc-address or servicerpc-address are not set in client configs. Contributed by Aaron T. Myers.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1338277 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
8cb6cc9d91
commit
c0bacb578b
|
@ -542,6 +542,9 @@ Release 2.0.0 - UNRELEASED
|
||||||
|
|
||||||
HDFS-3026. HA: Handle failure during HA state transition. (atm)
|
HDFS-3026. HA: Handle failure during HA state transition. (atm)
|
||||||
|
|
||||||
|
HDFS-3414. Balancer does not find NameNode if rpc-address or
|
||||||
|
servicerpc-address are not set in client configs. (atm)
|
||||||
|
|
||||||
BREAKDOWN OF HDFS-1623 SUBTASKS
|
BREAKDOWN OF HDFS-1623 SUBTASKS
|
||||||
|
|
||||||
HDFS-2179. Add fencing framework and mechanisms for NameNode HA. (todd)
|
HDFS-2179. Add fencing framework and mechanisms for NameNode HA. (todd)
|
||||||
|
|
|
@ -43,6 +43,7 @@ import org.apache.hadoop.HadoopIllegalArgumentException;
|
||||||
import org.apache.hadoop.classification.InterfaceAudience;
|
import org.apache.hadoop.classification.InterfaceAudience;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.BlockLocation;
|
import org.apache.hadoop.fs.BlockLocation;
|
||||||
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
import org.apache.hadoop.hdfs.protocol.AlreadyBeingCreatedException;
|
import org.apache.hadoop.hdfs.protocol.AlreadyBeingCreatedException;
|
||||||
import org.apache.hadoop.hdfs.protocol.ClientDatanodeProtocol;
|
import org.apache.hadoop.hdfs.protocol.ClientDatanodeProtocol;
|
||||||
|
@ -614,6 +615,14 @@ public class DFSUtil {
|
||||||
public static Collection<URI> getNameServiceUris(Configuration conf,
|
public static Collection<URI> getNameServiceUris(Configuration conf,
|
||||||
String... keys) {
|
String... keys) {
|
||||||
Set<URI> ret = new HashSet<URI>();
|
Set<URI> ret = new HashSet<URI>();
|
||||||
|
|
||||||
|
// We're passed multiple possible configuration keys for any given NN or HA
|
||||||
|
// nameservice, and search the config in order of these keys. In order to
|
||||||
|
// make sure that a later config lookup (e.g. fs.defaultFS) doesn't add a
|
||||||
|
// URI for a config key for which we've already found a preferred entry, we
|
||||||
|
// keep track of non-preferred keys here.
|
||||||
|
Set<URI> nonPreferredUris = new HashSet<URI>();
|
||||||
|
|
||||||
for (String nsId : getNameServiceIds(conf)) {
|
for (String nsId : getNameServiceIds(conf)) {
|
||||||
if (HAUtil.isHAEnabled(conf, nsId)) {
|
if (HAUtil.isHAEnabled(conf, nsId)) {
|
||||||
// Add the logical URI of the nameservice.
|
// Add the logical URI of the nameservice.
|
||||||
|
@ -624,24 +633,46 @@ public class DFSUtil {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Add the URI corresponding to the address of the NN.
|
// Add the URI corresponding to the address of the NN.
|
||||||
|
boolean uriFound = false;
|
||||||
for (String key : keys) {
|
for (String key : keys) {
|
||||||
String addr = conf.get(concatSuffixes(key, nsId));
|
String addr = conf.get(concatSuffixes(key, nsId));
|
||||||
if (addr != null) {
|
if (addr != null) {
|
||||||
ret.add(createUri(HdfsConstants.HDFS_URI_SCHEME,
|
URI uri = createUri(HdfsConstants.HDFS_URI_SCHEME,
|
||||||
NetUtils.createSocketAddr(addr)));
|
NetUtils.createSocketAddr(addr));
|
||||||
break;
|
if (!uriFound) {
|
||||||
|
uriFound = true;
|
||||||
|
ret.add(uri);
|
||||||
|
} else {
|
||||||
|
nonPreferredUris.add(uri);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the generic configuration keys.
|
// Add the generic configuration keys.
|
||||||
|
boolean uriFound = false;
|
||||||
for (String key : keys) {
|
for (String key : keys) {
|
||||||
String addr = conf.get(key);
|
String addr = conf.get(key);
|
||||||
if (addr != null) {
|
if (addr != null) {
|
||||||
ret.add(createUri("hdfs", NetUtils.createSocketAddr(addr)));
|
URI uri = createUri("hdfs", NetUtils.createSocketAddr(addr));
|
||||||
break;
|
if (!uriFound) {
|
||||||
|
uriFound = true;
|
||||||
|
ret.add(uri);
|
||||||
|
} else {
|
||||||
|
nonPreferredUris.add(uri);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add the default URI if it is an HDFS URI.
|
||||||
|
URI defaultUri = FileSystem.getDefaultUri(conf);
|
||||||
|
if (defaultUri != null &&
|
||||||
|
HdfsConstants.HDFS_URI_SCHEME.equals(defaultUri.getScheme()) &&
|
||||||
|
!nonPreferredUris.contains(defaultUri)) {
|
||||||
|
ret.add(defaultUri);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1252,6 +1252,13 @@ public class MiniDFSCluster {
|
||||||
return nameNodes[nnIndex].nameNode.getNameNodeAddress().getPort();
|
return nameNodes[nnIndex].nameNode.getNameNodeAddress().getPort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the service rpc port used by the NameNode at the given index.
|
||||||
|
*/
|
||||||
|
public int getNameNodeServicePort(int nnIndex) {
|
||||||
|
return nameNodes[nnIndex].nameNode.getServiceRpcAddress().getPort();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shutdown all the nodes in the cluster.
|
* Shutdown all the nodes in the cluster.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -533,29 +533,73 @@ public class TestDFSUtil {
|
||||||
public void testGetNNUris() throws Exception {
|
public void testGetNNUris() throws Exception {
|
||||||
HdfsConfiguration conf = new HdfsConfiguration();
|
HdfsConfiguration conf = new HdfsConfiguration();
|
||||||
|
|
||||||
final String NS1_NN1_HOST = "ns1-nn1.example.com:8020";
|
final String NS1_NN1_ADDR = "ns1-nn1.example.com:8020";
|
||||||
final String NS1_NN2_HOST = "ns1-nn1.example.com:8020";
|
final String NS1_NN2_ADDR = "ns1-nn2.example.com:8020";
|
||||||
final String NS2_NN_HOST = "ns2-nn.example.com:8020";
|
final String NS2_NN_ADDR = "ns2-nn.example.com:8020";
|
||||||
final String NN_HOST = "nn.example.com:8020";
|
final String NN1_ADDR = "nn.example.com:8020";
|
||||||
|
final String NN1_SRVC_ADDR = "nn.example.com:8021";
|
||||||
|
final String NN2_ADDR = "nn2.example.com:8020";
|
||||||
|
|
||||||
conf.set(DFS_FEDERATION_NAMESERVICES, "ns1,ns2");
|
conf.set(DFS_FEDERATION_NAMESERVICES, "ns1,ns2");
|
||||||
conf.set(DFSUtil.addKeySuffixes(DFS_HA_NAMENODES_KEY_PREFIX, "ns1"),"nn1,nn2");
|
conf.set(DFSUtil.addKeySuffixes(DFS_HA_NAMENODES_KEY_PREFIX, "ns1"),"nn1,nn2");
|
||||||
conf.set(DFSUtil.addKeySuffixes(
|
conf.set(DFSUtil.addKeySuffixes(
|
||||||
DFS_NAMENODE_RPC_ADDRESS_KEY, "ns1", "nn1"), NS1_NN1_HOST);
|
DFS_NAMENODE_RPC_ADDRESS_KEY, "ns1", "nn1"), NS1_NN1_ADDR);
|
||||||
conf.set(DFSUtil.addKeySuffixes(
|
conf.set(DFSUtil.addKeySuffixes(
|
||||||
DFS_NAMENODE_RPC_ADDRESS_KEY, "ns1", "nn2"), NS1_NN2_HOST);
|
DFS_NAMENODE_RPC_ADDRESS_KEY, "ns1", "nn2"), NS1_NN2_ADDR);
|
||||||
|
|
||||||
conf.set(DFSUtil.addKeySuffixes(DFS_NAMENODE_SERVICE_RPC_ADDRESS_KEY, "ns2"),
|
conf.set(DFSUtil.addKeySuffixes(DFS_NAMENODE_SERVICE_RPC_ADDRESS_KEY, "ns2"),
|
||||||
NS2_NN_HOST);
|
NS2_NN_ADDR);
|
||||||
|
|
||||||
conf.set(DFS_NAMENODE_RPC_ADDRESS_KEY, "hdfs://" + NN_HOST);
|
conf.set(DFS_NAMENODE_RPC_ADDRESS_KEY, "hdfs://" + NN1_ADDR);
|
||||||
|
|
||||||
Collection<URI> uris = DFSUtil.getNameServiceUris(conf, DFS_NAMENODE_RPC_ADDRESS_KEY,
|
conf.set(CommonConfigurationKeys.FS_DEFAULT_NAME_KEY, "hdfs://" + NN2_ADDR);
|
||||||
DFS_NAMENODE_SERVICE_RPC_ADDRESS_KEY);
|
|
||||||
|
Collection<URI> uris = DFSUtil.getNameServiceUris(conf,
|
||||||
|
DFS_NAMENODE_SERVICE_RPC_ADDRESS_KEY, DFS_NAMENODE_RPC_ADDRESS_KEY);
|
||||||
|
|
||||||
|
assertEquals(4, uris.size());
|
||||||
|
assertTrue(uris.contains(new URI("hdfs://ns1")));
|
||||||
|
assertTrue(uris.contains(new URI("hdfs://" + NS2_NN_ADDR)));
|
||||||
|
assertTrue(uris.contains(new URI("hdfs://" + NN1_ADDR)));
|
||||||
|
assertTrue(uris.contains(new URI("hdfs://" + NN2_ADDR)));
|
||||||
|
|
||||||
|
// Make sure that non-HDFS URIs in fs.defaultFS don't get included.
|
||||||
|
conf.set(CommonConfigurationKeys.FS_DEFAULT_NAME_KEY,
|
||||||
|
"viewfs://vfs-name.example.com");
|
||||||
|
|
||||||
|
uris = DFSUtil.getNameServiceUris(conf, DFS_NAMENODE_SERVICE_RPC_ADDRESS_KEY,
|
||||||
|
DFS_NAMENODE_RPC_ADDRESS_KEY);
|
||||||
|
|
||||||
assertEquals(3, uris.size());
|
assertEquals(3, uris.size());
|
||||||
assertTrue(uris.contains(new URI("hdfs://ns1")));
|
assertTrue(uris.contains(new URI("hdfs://ns1")));
|
||||||
assertTrue(uris.contains(new URI("hdfs://" + NS2_NN_HOST)));
|
assertTrue(uris.contains(new URI("hdfs://" + NS2_NN_ADDR)));
|
||||||
assertTrue(uris.contains(new URI("hdfs://" + NN_HOST)));
|
assertTrue(uris.contains(new URI("hdfs://" + NN1_ADDR)));
|
||||||
|
|
||||||
|
// Make sure that an HA URI being the default URI doesn't result in multiple
|
||||||
|
// entries being returned.
|
||||||
|
conf.set(CommonConfigurationKeys.FS_DEFAULT_NAME_KEY, "hdfs://ns1");
|
||||||
|
|
||||||
|
uris = DFSUtil.getNameServiceUris(conf, DFS_NAMENODE_SERVICE_RPC_ADDRESS_KEY,
|
||||||
|
DFS_NAMENODE_RPC_ADDRESS_KEY);
|
||||||
|
|
||||||
|
assertEquals(3, uris.size());
|
||||||
|
assertTrue(uris.contains(new URI("hdfs://ns1")));
|
||||||
|
assertTrue(uris.contains(new URI("hdfs://" + NS2_NN_ADDR)));
|
||||||
|
assertTrue(uris.contains(new URI("hdfs://" + NN1_ADDR)));
|
||||||
|
|
||||||
|
// Make sure that when a service RPC address is used that is distinct from
|
||||||
|
// the client RPC address, and that client RPC address is also used as the
|
||||||
|
// default URI, that the client URI does not end up in the set of URIs
|
||||||
|
// returned.
|
||||||
|
conf = new HdfsConfiguration();
|
||||||
|
conf.set(CommonConfigurationKeys.FS_DEFAULT_NAME_KEY, "hdfs://" + NN1_ADDR);
|
||||||
|
conf.set(DFS_NAMENODE_RPC_ADDRESS_KEY, NN1_ADDR);
|
||||||
|
conf.set(DFS_NAMENODE_SERVICE_RPC_ADDRESS_KEY, NN1_SRVC_ADDR);
|
||||||
|
|
||||||
|
uris = DFSUtil.getNameServiceUris(conf, DFS_NAMENODE_SERVICE_RPC_ADDRESS_KEY,
|
||||||
|
DFS_NAMENODE_RPC_ADDRESS_KEY);
|
||||||
|
|
||||||
|
assertEquals(1, uris.size());
|
||||||
|
assertTrue(uris.contains(new URI("hdfs://" + NN1_SRVC_ADDR)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue