CreateEditsLog.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:8k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.hdfs.server.namenode;
  19. import java.io.File;
  20. import java.io.IOException;
  21. import org.apache.hadoop.fs.permission.FsPermission;
  22. import org.apache.hadoop.fs.permission.PermissionStatus;
  23. import org.apache.hadoop.hdfs.protocol.Block;
  24. import org.apache.hadoop.hdfs.server.common.GenerationStamp;
  25. import org.apache.hadoop.hdfs.server.common.Storage;
  26. import org.apache.hadoop.hdfs.server.namenode.BlocksMap.BlockInfo;
  27. /**
  28.  * 
  29.  * CreateEditsLog
  30.  *   Synopsis: CreateEditsLog -f numFiles StartingBlockId numBlocksPerFile
  31.  *        [-r replicafactor] [-d editsLogDirectory]
  32.  *             Default replication factor is 1
  33.  *             Default edits log directory is /tmp/EditsLogOut
  34.  *   
  35.  *   Create a name node's edits log in /tmp/EditsLogOut.
  36.  *   The file /tmp/EditsLogOut/current/edits can be copied to a name node's
  37.  *   dfs.name.dir/current direcotry and the name node can be started as usual.
  38.  *   
  39.  *   The files are created in /createdViaInjectingInEditsLog
  40.  *   The file names contain the starting and ending blockIds; hence once can 
  41.  *   create multiple edits logs using this command using non overlapping 
  42.  *   block ids and feed the files to a single name node.
  43.  *   
  44.  *   See Also @link #DataNodeCluster for injecting a set of matching
  45.  *   blocks created with this command into a set of simulated data nodes.
  46.  *
  47.  */
  48. public class CreateEditsLog {
  49.   static final String BASE_PATH = "/createdViaInjectingInEditsLog";
  50.   static final String EDITS_DIR = "/tmp/EditsLogOut";
  51.   static String edits_dir = EDITS_DIR;
  52.   static final public long BLOCK_GENERATION_STAMP =
  53.     GenerationStamp.FIRST_VALID_STAMP;
  54.   
  55.   static void addFiles(FSEditLog editLog, int numFiles, short replication, 
  56.                          int blocksPerFile, long startingBlockId,
  57.                          FileNameGenerator nameGenerator) {
  58.     
  59.     PermissionStatus p = new PermissionStatus("joeDoe", "people",
  60.                                       new FsPermission((short)0777));
  61.     INodeDirectory dirInode = new INodeDirectory(p, 0L);
  62.     editLog.logMkDir(BASE_PATH, dirInode);
  63.     long blockSize = 10;
  64.     BlockInfo[] blocks = new BlockInfo[blocksPerFile];
  65.     for (int iB = 0; iB < blocksPerFile; ++iB) {
  66.       blocks[iB] = 
  67.        new BlockInfo(new Block(0, blockSize, BLOCK_GENERATION_STAMP),
  68.                                replication);
  69.     }
  70.     
  71.     long currentBlockId = startingBlockId;
  72.     long bidAtSync = startingBlockId;
  73.     for (int iF = 0; iF < numFiles; iF++) {
  74.       for (int iB = 0; iB < blocksPerFile; ++iB) {
  75.          blocks[iB].setBlockId(currentBlockId++);
  76.       }
  77.       try {
  78.         INodeFileUnderConstruction inode = new INodeFileUnderConstruction(
  79.                       null, replication, 0, blockSize, blocks, p, "", "", null);
  80.         // Append path to filename with information about blockIDs 
  81.         String path = "_" + iF + "_B" + blocks[0].getBlockId() + 
  82.                       "_to_B" + blocks[blocksPerFile-1].getBlockId() + "_";
  83.         String filePath = nameGenerator.getNextFileName("");
  84.         filePath = filePath + path;
  85.         // Log the new sub directory in edits
  86.         if ((iF % nameGenerator.getFilesPerDirectory())  == 0) {
  87.           String currentDir = nameGenerator.getCurrentDir();
  88.           dirInode = new INodeDirectory(p, 0L);
  89.           editLog.logMkDir(currentDir, dirInode);
  90.         }
  91.         editLog.logOpenFile(filePath, inode);
  92.         editLog.logCloseFile(filePath, inode);
  93.         if (currentBlockId - bidAtSync >= 2000) { // sync every 2K blocks
  94.           editLog.logSync();
  95.           bidAtSync = currentBlockId;
  96.         }
  97.       } catch (IOException e) {
  98.         System.out.println("Creating trascation for file " + iF +
  99.             " encountered exception " + e);
  100.       }
  101.     }
  102.     System.out.println("Created edits log in directory " + edits_dir);
  103.     System.out.println(" containing " +
  104.        numFiles + " File-Creates, each file with " + blocksPerFile + " blocks");
  105.     System.out.println(" blocks range: " + 
  106.         startingBlockId + " to " + (currentBlockId-1));
  107.   }
  108.   
  109.   static String usage = "Usage: createditlogs " +
  110.   " -f  numFiles startingBlockIds NumBlocksPerFile  [-r replicafactor] " + 
  111.    "[-d editsLogDirectory]n" + 
  112.    "      Default replication factor is 1n" +
  113.    "      Default edits log direcory is " + EDITS_DIR + "n";
  114.   static void printUsageExit() {
  115.     System.out.println(usage);
  116.     System.exit(-1); 
  117.     }
  118.     static void printUsageExit(String err) {
  119.     System.out.println(err);
  120.     printUsageExit();
  121.   }
  122.   /**
  123.    * @param args
  124.    * @throws IOException 
  125.    */
  126.   public static void main(String[] args) throws IOException {
  127.     long startingBlockId = 1;
  128.     int numFiles = 0;
  129.     short replication = 1;
  130.     int numBlocksPerFile = 0;
  131.     if (args.length == 0) {
  132.       printUsageExit();
  133.     }
  134.     for (int i = 0; i < args.length; i++) { // parse command line
  135.       if (args[i].equals("-h"))
  136.         printUsageExit();
  137.       if (args[i].equals("-f")) {
  138.        if (i + 3 >= args.length || args[i+1].startsWith("-") || 
  139.            args[i+2].startsWith("-") || args[i+3].startsWith("-")) {
  140.          printUsageExit(
  141.              "Missing num files, starting block and/or number of blocks");
  142.        }
  143.        numFiles = Integer.parseInt(args[++i]);
  144.        startingBlockId = Integer.parseInt(args[++i]);
  145.        numBlocksPerFile = Integer.parseInt(args[++i]);
  146.        if (numFiles <=0 || numBlocksPerFile <= 0) {
  147.          printUsageExit("numFiles and numBlocksPerFile most be greater than 0");
  148.        }
  149.       } else if (args[i].equals("-r") || args[i+1].startsWith("-")) {
  150.         if (i + 1 >= args.length) {
  151.           printUsageExit(
  152.               "Missing num files, starting block and/or number of blocks");
  153.         }
  154.         replication = Short.parseShort(args[++i]);
  155.       } else if (args[i].equals("-d")) {
  156.         if (i + 1 >= args.length || args[i+1].startsWith("-")) {
  157.           printUsageExit("Missing edits logs directory");
  158.         }
  159.         edits_dir = args[++i];
  160.       } else {
  161.         printUsageExit();
  162.       }
  163.     }
  164.     
  165.     File editsLogDir = new File(edits_dir);
  166.     File subStructureDir = new File(edits_dir + "/" + 
  167.         Storage.STORAGE_DIR_CURRENT);
  168.     if ( !editsLogDir.exists() ) {
  169.       if ( !editsLogDir.mkdir()) {
  170.         System.out.println("cannot create " + edits_dir);
  171.         System.exit(-1);
  172.       }
  173.     }
  174.     if ( !subStructureDir.exists() ) {
  175.       if ( !subStructureDir.mkdir()) {
  176.         System.out.println("cannot create subdirs of " + edits_dir);
  177.         System.exit(-1);
  178.       }
  179.     }
  180.   
  181.     FSImage fsImage = new FSImage(new File(edits_dir));
  182.     FileNameGenerator nameGenerator = new FileNameGenerator(BASE_PATH, 100);
  183.     FSEditLog editLog = fsImage.getEditLog();
  184.     editLog.createEditLogFile(fsImage.getFsEditName());
  185.     editLog.open();
  186.     addFiles(editLog, numFiles, replication, numBlocksPerFile, startingBlockId,
  187.              nameGenerator);
  188.     editLog.logSync();
  189.     editLog.close();
  190.   }
  191. }