HDFS-5742. Merging r1570067 from trunk to branch-2.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1570068 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
01730690f3
commit
10e98ce6bb
|
@ -203,6 +203,9 @@ Release 2.4.0 - UNRELEASED
|
||||||
HDFS-5483. NN should gracefully handle multiple block replicas on same DN.
|
HDFS-5483. NN should gracefully handle multiple block replicas on same DN.
|
||||||
(Arpit Agarwal)
|
(Arpit Agarwal)
|
||||||
|
|
||||||
|
HDFS-5742. DatanodeCluster (mini cluster of DNs) fails to start.
|
||||||
|
(Arpit Agarwal)
|
||||||
|
|
||||||
BREAKDOWN OF HDFS-5698 SUBTASKS AND RELATED JIRAS
|
BREAKDOWN OF HDFS-5698 SUBTASKS AND RELATED JIRAS
|
||||||
|
|
||||||
HDFS-5717. Save FSImage header in protobuf. (Haohui Mai via jing9)
|
HDFS-5717. Save FSImage header in protobuf. (Haohui Mai via jing9)
|
||||||
|
|
|
@ -143,6 +143,7 @@ public class FSImage implements Closeable {
|
||||||
"FSImage.format should be called with an uninitialized namesystem, has " +
|
"FSImage.format should be called with an uninitialized namesystem, has " +
|
||||||
fileCount + " files");
|
fileCount + " files");
|
||||||
NamespaceInfo ns = NNStorage.newNamespaceInfo();
|
NamespaceInfo ns = NNStorage.newNamespaceInfo();
|
||||||
|
LOG.info("Allocated new BlockPoolId: " + ns.getBlockPoolID());
|
||||||
ns.clusterID = clusterId;
|
ns.clusterID = clusterId;
|
||||||
|
|
||||||
storage.format(ns);
|
storage.format(ns);
|
||||||
|
|
|
@ -69,8 +69,9 @@ public class DataNodeCluster {
|
||||||
static final String USAGE =
|
static final String USAGE =
|
||||||
"Usage: datanodecluster " +
|
"Usage: datanodecluster " +
|
||||||
" -n <numDataNodes> " +
|
" -n <numDataNodes> " +
|
||||||
|
" -bpid <bpid>" +
|
||||||
" [-racks <numRacks>] " +
|
" [-racks <numRacks>] " +
|
||||||
" [-simulated] " +
|
" [-simulated [<simulatedCapacityPerDn>]] " +
|
||||||
" [-inject startingBlockId numBlocksPerDN]" +
|
" [-inject startingBlockId numBlocksPerDN]" +
|
||||||
" [-r replicationFactorForInjectedBlocks]" +
|
" [-r replicationFactorForInjectedBlocks]" +
|
||||||
" [-d dataNodeDirs]\n" +
|
" [-d dataNodeDirs]\n" +
|
||||||
|
@ -91,7 +92,7 @@ public class DataNodeCluster {
|
||||||
printUsageExit();
|
printUsageExit();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) throws InterruptedException {
|
||||||
int numDataNodes = 0;
|
int numDataNodes = 0;
|
||||||
int numRacks = 0;
|
int numRacks = 0;
|
||||||
boolean inject = false;
|
boolean inject = false;
|
||||||
|
@ -99,6 +100,8 @@ public class DataNodeCluster {
|
||||||
int numBlocksPerDNtoInject = 0;
|
int numBlocksPerDNtoInject = 0;
|
||||||
int replication = 1;
|
int replication = 1;
|
||||||
boolean checkDataNodeAddrConfig = false;
|
boolean checkDataNodeAddrConfig = false;
|
||||||
|
long simulatedCapacityPerDn = SimulatedFSDataset.DEFAULT_CAPACITY;
|
||||||
|
String bpid = null;
|
||||||
|
|
||||||
Configuration conf = new HdfsConfiguration();
|
Configuration conf = new HdfsConfiguration();
|
||||||
|
|
||||||
|
@ -115,7 +118,7 @@ public class DataNodeCluster {
|
||||||
numRacks = Integer.parseInt(args[i]);
|
numRacks = Integer.parseInt(args[i]);
|
||||||
} else if (args[i].equals("-r")) {
|
} else if (args[i].equals("-r")) {
|
||||||
if (++i >= args.length || args[i].startsWith("-")) {
|
if (++i >= args.length || args[i].startsWith("-")) {
|
||||||
printUsageExit("Missing replicaiton factor");
|
printUsageExit("Missing replication factor");
|
||||||
}
|
}
|
||||||
replication = Integer.parseInt(args[i]);
|
replication = Integer.parseInt(args[i]);
|
||||||
} else if (args[i].equals("-d")) {
|
} else if (args[i].equals("-d")) {
|
||||||
|
@ -125,6 +128,14 @@ public class DataNodeCluster {
|
||||||
dataNodeDirs = args[i];
|
dataNodeDirs = args[i];
|
||||||
} else if (args[i].equals("-simulated")) {
|
} else if (args[i].equals("-simulated")) {
|
||||||
SimulatedFSDataset.setFactory(conf);
|
SimulatedFSDataset.setFactory(conf);
|
||||||
|
if ((i+1) < args.length && !args[i+1].startsWith("-")) {
|
||||||
|
simulatedCapacityPerDn = Long.parseLong(args[++i]);
|
||||||
|
}
|
||||||
|
} else if (args[i].equals("-bpid")) {
|
||||||
|
if (++i >= args.length || args[i].startsWith("-")) {
|
||||||
|
printUsageExit("Missing blockpoolid parameter");
|
||||||
|
}
|
||||||
|
bpid = args[i];
|
||||||
} else if (args[i].equals("-inject")) {
|
} else if (args[i].equals("-inject")) {
|
||||||
if (!FsDatasetSpi.Factory.getFactory(conf).isSimulated()) {
|
if (!FsDatasetSpi.Factory.getFactory(conf).isSimulated()) {
|
||||||
System.out.print("-inject is valid only for simulated");
|
System.out.print("-inject is valid only for simulated");
|
||||||
|
@ -153,6 +164,9 @@ public class DataNodeCluster {
|
||||||
printUsageExit("Replication must be less than or equal to numDataNodes");
|
printUsageExit("Replication must be less than or equal to numDataNodes");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
if (bpid == null) {
|
||||||
|
printUsageExit("BlockPoolId must be provided");
|
||||||
|
}
|
||||||
String nameNodeAdr = FileSystem.getDefaultUri(conf).getAuthority();
|
String nameNodeAdr = FileSystem.getDefaultUri(conf).getAuthority();
|
||||||
if (nameNodeAdr == null) {
|
if (nameNodeAdr == null) {
|
||||||
System.out.println("No name node address and port in config");
|
System.out.println("No name node address and port in config");
|
||||||
|
@ -165,6 +179,11 @@ public class DataNodeCluster {
|
||||||
|
|
||||||
System.setProperty("test.build.data", dataNodeDirs);
|
System.setProperty("test.build.data", dataNodeDirs);
|
||||||
|
|
||||||
|
long simulatedCapacities[] = new long[numDataNodes];
|
||||||
|
for (int i = 0; i < numDataNodes; ++i) {
|
||||||
|
simulatedCapacities[i] = simulatedCapacityPerDn;
|
||||||
|
}
|
||||||
|
|
||||||
MiniDFSCluster mc = new MiniDFSCluster();
|
MiniDFSCluster mc = new MiniDFSCluster();
|
||||||
try {
|
try {
|
||||||
mc.formatDataNodeDirs();
|
mc.formatDataNodeDirs();
|
||||||
|
@ -182,13 +201,12 @@ public class DataNodeCluster {
|
||||||
//rack4DataNode[i] = racks[i%numRacks];
|
//rack4DataNode[i] = racks[i%numRacks];
|
||||||
rack4DataNode[i] = rackPrefix + "-" + i%numRacks;
|
rack4DataNode[i] = rackPrefix + "-" + i%numRacks;
|
||||||
System.out.println("Data Node " + i + " using " + rack4DataNode[i]);
|
System.out.println("Data Node " + i + " using " + rack4DataNode[i]);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
mc.startDataNodes(conf, numDataNodes, true, StartupOption.REGULAR,
|
mc.startDataNodes(conf, numDataNodes, true, StartupOption.REGULAR,
|
||||||
rack4DataNode, null, null, false, checkDataNodeAddrConfig);
|
rack4DataNode, null, simulatedCapacities, false, checkDataNodeAddrConfig);
|
||||||
|
Thread.sleep(10*1000); // Give the DN some time to connect to NN and init storage directories.
|
||||||
if (inject) {
|
if (inject) {
|
||||||
long blockSize = 10;
|
long blockSize = 10;
|
||||||
System.out.println("Injecting " + numBlocksPerDNtoInject +
|
System.out.println("Injecting " + numBlocksPerDNtoInject +
|
||||||
|
@ -203,7 +221,7 @@ public class DataNodeCluster {
|
||||||
}
|
}
|
||||||
for (int i = 1; i <= replication; ++i) {
|
for (int i = 1; i <= replication; ++i) {
|
||||||
// inject blocks for dn_i into dn_i and replica in dn_i's neighbors
|
// inject blocks for dn_i into dn_i and replica in dn_i's neighbors
|
||||||
mc.injectBlocks((i_dn + i- 1)% numDataNodes, Arrays.asList(blocks));
|
mc.injectBlocks((i_dn + i- 1)% numDataNodes, Arrays.asList(blocks), bpid);
|
||||||
System.out.println("Injecting blocks of dn " + i_dn + " into dn" +
|
System.out.println("Injecting blocks of dn " + i_dn + " into dn" +
|
||||||
((i_dn + i- 1)% numDataNodes));
|
((i_dn + i- 1)% numDataNodes));
|
||||||
}
|
}
|
||||||
|
|
|
@ -2045,17 +2045,19 @@ public class MiniDFSCluster {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method is valid only if the data nodes have simulated data
|
* This method is valid only if the data nodes have simulated data
|
||||||
* @param dataNodeIndex - data node i which to inject - the index is same as for getDataNodes()
|
* @param dataNodeIndex - data node i which to inject - the index is same as for getDataNodes()
|
||||||
* @param blocksToInject - the blocks
|
* @param blocksToInject - the blocks
|
||||||
|
* @param bpid - (optional) the block pool id to use for injecting blocks.
|
||||||
|
* If not supplied then it is queried from the in-process NameNode.
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
* if not simulatedFSDataset
|
* if not simulatedFSDataset
|
||||||
* if any of blocks already exist in the data node
|
* if any of blocks already exist in the data node
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public void injectBlocks(int dataNodeIndex, Iterable<Block> blocksToInject) throws IOException {
|
public void injectBlocks(int dataNodeIndex,
|
||||||
|
Iterable<Block> blocksToInject, String bpid) throws IOException {
|
||||||
if (dataNodeIndex < 0 || dataNodeIndex > dataNodes.size()) {
|
if (dataNodeIndex < 0 || dataNodeIndex > dataNodes.size()) {
|
||||||
throw new IndexOutOfBoundsException();
|
throw new IndexOutOfBoundsException();
|
||||||
}
|
}
|
||||||
|
@ -2064,7 +2066,9 @@ public class MiniDFSCluster {
|
||||||
if (!(dataSet instanceof SimulatedFSDataset)) {
|
if (!(dataSet instanceof SimulatedFSDataset)) {
|
||||||
throw new IOException("injectBlocks is valid only for SimilatedFSDataset");
|
throw new IOException("injectBlocks is valid only for SimilatedFSDataset");
|
||||||
}
|
}
|
||||||
String bpid = getNamesystem().getBlockPoolId();
|
if (bpid == null) {
|
||||||
|
bpid = getNamesystem().getBlockPoolId();
|
||||||
|
}
|
||||||
SimulatedFSDataset sdataset = (SimulatedFSDataset) dataSet;
|
SimulatedFSDataset sdataset = (SimulatedFSDataset) dataSet;
|
||||||
sdataset.injectBlocks(bpid, blocksToInject);
|
sdataset.injectBlocks(bpid, blocksToInject);
|
||||||
dataNodes.get(dataNodeIndex).datanode.scheduleAllBlockReport(0);
|
dataNodes.get(dataNodeIndex).datanode.scheduleAllBlockReport(0);
|
||||||
|
@ -2089,25 +2093,6 @@ public class MiniDFSCluster {
|
||||||
dataNodes.get(dataNodeIndex).datanode.scheduleAllBlockReport(0);
|
dataNodes.get(dataNodeIndex).datanode.scheduleAllBlockReport(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This method is valid only if the data nodes have simulated data
|
|
||||||
* @param blocksToInject - blocksToInject[] is indexed in the same order as the list
|
|
||||||
* of datanodes returned by getDataNodes()
|
|
||||||
* @throws IOException
|
|
||||||
* if not simulatedFSDataset
|
|
||||||
* if any of blocks already exist in the data nodes
|
|
||||||
* Note the rest of the blocks are not injected.
|
|
||||||
*/
|
|
||||||
public void injectBlocks(Iterable<Block>[] blocksToInject)
|
|
||||||
throws IOException {
|
|
||||||
if (blocksToInject.length > dataNodes.size()) {
|
|
||||||
throw new IndexOutOfBoundsException();
|
|
||||||
}
|
|
||||||
for (int i = 0; i < blocksToInject.length; ++i) {
|
|
||||||
injectBlocks(i, blocksToInject[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the softLimit and hardLimit of client lease periods
|
* Set the softLimit and hardLimit of client lease periods
|
||||||
*/
|
*/
|
||||||
|
@ -2154,12 +2139,14 @@ public class MiniDFSCluster {
|
||||||
* @return the base directory for this instance.
|
* @return the base directory for this instance.
|
||||||
*/
|
*/
|
||||||
protected String determineDfsBaseDir() {
|
protected String determineDfsBaseDir() {
|
||||||
String dfsdir = conf.get(HDFS_MINIDFS_BASEDIR, null);
|
if (conf != null) {
|
||||||
if (dfsdir == null) {
|
final String dfsdir = conf.get(HDFS_MINIDFS_BASEDIR, null);
|
||||||
dfsdir = getBaseDirectory();
|
if (dfsdir != null) {
|
||||||
}
|
|
||||||
return dfsdir;
|
return dfsdir;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
return getBaseDirectory();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the base directory for any DFS cluster whose configuration does
|
* Get the base directory for any DFS cluster whose configuration does
|
||||||
|
|
|
@ -186,7 +186,7 @@ public class TestInjectionForSimulatedStorage {
|
||||||
// Insert all the blocks in the first data node
|
// Insert all the blocks in the first data node
|
||||||
|
|
||||||
LOG.info("Inserting " + uniqueBlocks.size() + " blocks");
|
LOG.info("Inserting " + uniqueBlocks.size() + " blocks");
|
||||||
cluster.injectBlocks(0, uniqueBlocks);
|
cluster.injectBlocks(0, uniqueBlocks, null);
|
||||||
|
|
||||||
dfsClient = new DFSClient(new InetSocketAddress("localhost",
|
dfsClient = new DFSClient(new InetSocketAddress("localhost",
|
||||||
cluster.getNameNodePort()),
|
cluster.getNameNodePort()),
|
||||||
|
|
|
@ -209,7 +209,7 @@ public class TestBalancer {
|
||||||
ClientProtocol.class).getProxy();
|
ClientProtocol.class).getProxy();
|
||||||
|
|
||||||
for(int i = 0; i < blocksDN.length; i++)
|
for(int i = 0; i < blocksDN.length; i++)
|
||||||
cluster.injectBlocks(i, Arrays.asList(blocksDN[i]));
|
cluster.injectBlocks(i, Arrays.asList(blocksDN[i]), null);
|
||||||
|
|
||||||
final long totalCapacity = sum(capacities);
|
final long totalCapacity = sum(capacities);
|
||||||
runBalancer(conf, totalUsedSpace, totalCapacity);
|
runBalancer(conf, totalUsedSpace, totalCapacity);
|
||||||
|
|
|
@ -141,7 +141,7 @@ public class TestReadOnlySharedStorage {
|
||||||
validateNumberReplicas(1);
|
validateNumberReplicas(1);
|
||||||
|
|
||||||
// Inject the block into the datanode with READ_ONLY_SHARED storage
|
// Inject the block into the datanode with READ_ONLY_SHARED storage
|
||||||
cluster.injectBlocks(RO_NODE_INDEX, Collections.singleton(block));
|
cluster.injectBlocks(0, RO_NODE_INDEX, Collections.singleton(block));
|
||||||
|
|
||||||
// There should now be 2 *locations* for the block
|
// There should now be 2 *locations* for the block
|
||||||
// Must wait until the NameNode has processed the block report for the injected blocks
|
// Must wait until the NameNode has processed the block report for the injected blocks
|
||||||
|
|
|
@ -57,7 +57,7 @@ public class CreateEditsLog {
|
||||||
GenerationStamp.LAST_RESERVED_STAMP;
|
GenerationStamp.LAST_RESERVED_STAMP;
|
||||||
|
|
||||||
static void addFiles(FSEditLog editLog, int numFiles, short replication,
|
static void addFiles(FSEditLog editLog, int numFiles, short replication,
|
||||||
int blocksPerFile, long startingBlockId,
|
int blocksPerFile, long startingBlockId, long blockSize,
|
||||||
FileNameGenerator nameGenerator) {
|
FileNameGenerator nameGenerator) {
|
||||||
|
|
||||||
PermissionStatus p = new PermissionStatus("joeDoe", "people",
|
PermissionStatus p = new PermissionStatus("joeDoe", "people",
|
||||||
|
@ -66,7 +66,6 @@ public class CreateEditsLog {
|
||||||
INodeDirectory dirInode = new INodeDirectory(inodeId.nextValue(), null, p,
|
INodeDirectory dirInode = new INodeDirectory(inodeId.nextValue(), null, p,
|
||||||
0L);
|
0L);
|
||||||
editLog.logMkDir(BASE_PATH, dirInode);
|
editLog.logMkDir(BASE_PATH, dirInode);
|
||||||
long blockSize = 10;
|
|
||||||
BlockInfo[] blocks = new BlockInfo[blocksPerFile];
|
BlockInfo[] blocks = new BlockInfo[blocksPerFile];
|
||||||
for (int iB = 0; iB < blocksPerFile; ++iB) {
|
for (int iB = 0; iB < blocksPerFile; ++iB) {
|
||||||
blocks[iB] =
|
blocks[iB] =
|
||||||
|
@ -144,6 +143,7 @@ public class CreateEditsLog {
|
||||||
int numFiles = 0;
|
int numFiles = 0;
|
||||||
short replication = 1;
|
short replication = 1;
|
||||||
int numBlocksPerFile = 0;
|
int numBlocksPerFile = 0;
|
||||||
|
long blockSize = 10;
|
||||||
|
|
||||||
if (args.length == 0) {
|
if (args.length == 0) {
|
||||||
printUsageExit();
|
printUsageExit();
|
||||||
|
@ -164,10 +164,16 @@ public class CreateEditsLog {
|
||||||
if (numFiles <=0 || numBlocksPerFile <= 0) {
|
if (numFiles <=0 || numBlocksPerFile <= 0) {
|
||||||
printUsageExit("numFiles and numBlocksPerFile most be greater than 0");
|
printUsageExit("numFiles and numBlocksPerFile most be greater than 0");
|
||||||
}
|
}
|
||||||
|
} else if (args[i].equals("-l")) {
|
||||||
|
if (i + 1 >= args.length) {
|
||||||
|
printUsageExit(
|
||||||
|
"Missing block length");
|
||||||
|
}
|
||||||
|
blockSize = Long.parseLong(args[++i]);
|
||||||
} else if (args[i].equals("-r") || args[i+1].startsWith("-")) {
|
} else if (args[i].equals("-r") || args[i+1].startsWith("-")) {
|
||||||
if (i + 1 >= args.length) {
|
if (i + 1 >= args.length) {
|
||||||
printUsageExit(
|
printUsageExit(
|
||||||
"Missing num files, starting block and/or number of blocks");
|
"Missing replication factor");
|
||||||
}
|
}
|
||||||
replication = Short.parseShort(args[++i]);
|
replication = Short.parseShort(args[++i]);
|
||||||
} else if (args[i].equals("-d")) {
|
} else if (args[i].equals("-d")) {
|
||||||
|
@ -202,7 +208,7 @@ public class CreateEditsLog {
|
||||||
FSEditLog editLog = FSImageTestUtil.createStandaloneEditLog(editsLogDir);
|
FSEditLog editLog = FSImageTestUtil.createStandaloneEditLog(editsLogDir);
|
||||||
editLog.openForWrite();
|
editLog.openForWrite();
|
||||||
addFiles(editLog, numFiles, replication, numBlocksPerFile, startingBlockId,
|
addFiles(editLog, numFiles, replication, numBlocksPerFile, startingBlockId,
|
||||||
nameGenerator);
|
blockSize, nameGenerator);
|
||||||
editLog.logSync();
|
editLog.logSync();
|
||||||
editLog.close();
|
editLog.close();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue