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

网格计算

开发平台:

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.fs.loadGenerator;
  19. import java.io.BufferedReader;
  20. import java.io.File;
  21. import java.io.FileReader;
  22. import java.io.IOException;
  23. import org.apache.hadoop.conf.Configuration;
  24. import org.apache.hadoop.conf.Configured;
  25. import org.apache.hadoop.fs.FSDataOutputStream;
  26. import org.apache.hadoop.fs.FileSystem;
  27. import org.apache.hadoop.fs.Path;
  28. import org.apache.hadoop.util.Tool;
  29. import org.apache.hadoop.util.ToolRunner;
  30. /**
  31.  * This program reads the directory structure and file structure from
  32.  * the input directory and creates the namespace in the file system
  33.  * specified by the configuration in the specified root.
  34.  * All the files are filled with 'a'.
  35.  * 
  36.  * The synopsis of the command is
  37.  * java DataGenerator 
  38.  *   -inDir <inDir>: input directory name where directory/file structures
  39.  *                   are stored. Its default value is the current directory.
  40.  *   -root <root>: the name of the root directory which the new namespace 
  41.  *                 is going to be placed under. 
  42.  *                 Its default value is "/testLoadSpace".
  43.  */
  44. public class DataGenerator extends Configured implements Tool {
  45.   private File inDir = StructureGenerator.DEFAULT_STRUCTURE_DIRECTORY;
  46.   private Path root = DEFAULT_ROOT;
  47.   private FileSystem fs;
  48.   final static private long BLOCK_SIZE = 10;
  49.   final static private String USAGE = "java DataGenerator " +
  50.    "-inDir <inDir> " +
  51.    "-root <root>";
  52.   
  53.   /** default name of the root where the test namespace will be placed under */
  54.   final static Path DEFAULT_ROOT = new Path("/testLoadSpace");
  55.   
  56.   /** Main function.
  57.    * It first parses the command line arguments.
  58.    * It then reads the directory structure from the input directory 
  59.    * structure file and creates directory structure in the file system
  60.    * namespace. Afterwards it reads the file attributes and creates files 
  61.    * in the file. All file content is filled with 'a'.
  62.    */
  63.   public int run(String[] args) throws Exception {
  64.     int exitCode = 0;
  65.     exitCode = init(args);
  66.     if (exitCode != 0) {
  67.       return exitCode;
  68.     }
  69.     genDirStructure();
  70.     genFiles();
  71.     return exitCode;
  72.   }
  73.   /** Parse the command line arguments and initialize the data */
  74.   private int init(String[] args) {
  75.     try { // initialize file system handle
  76.       fs = FileSystem.get(getConf());
  77.     } catch (IOException ioe) {
  78.       System.err.println("Can not initialize the file system: " + 
  79.           ioe.getLocalizedMessage());
  80.       return -1;
  81.     }
  82.     for (int i = 0; i < args.length; i++) { // parse command line
  83.       if (args[i].equals("-root")) {
  84.         root = new Path(args[++i]);
  85.       } else if (args[i].equals("-inDir")) {
  86.         inDir = new File(args[++i]);
  87.       } else {
  88.         System.err.println(USAGE);
  89.         ToolRunner.printGenericCommandUsage(System.err);
  90.         System.exit(-1);
  91.       }
  92.     }
  93.     return 0;
  94.   }
  95.   
  96.   /** Read directory structure file under the input directory.
  97.    * Create each directory under the specified root.
  98.    * The directory names are relative to the specified root.
  99.    */
  100.   private void genDirStructure() throws IOException {
  101.     BufferedReader in = new BufferedReader(
  102.         new FileReader(new File(inDir, 
  103.             StructureGenerator.DIR_STRUCTURE_FILE_NAME)));
  104.     String line;
  105.     while ((line=in.readLine()) != null) {
  106.       fs.mkdirs(new Path(root+line));
  107.     }
  108.   }
  109.   /** Read file structure file under the input directory.
  110.    * Create each file under the specified root.
  111.    * The file names are relative to the root.
  112.    */
  113.   private void genFiles() throws IOException {
  114.     BufferedReader in = new BufferedReader(
  115.         new FileReader(new File(inDir, 
  116.             StructureGenerator.FILE_STRUCTURE_FILE_NAME)));
  117.     String line;
  118.     while ((line=in.readLine()) != null) {
  119.       String[] tokens = line.split(" ");
  120.       if (tokens.length != 2) {
  121.         throw new IOException("Expect at most 2 tokens per line: " + line);
  122.       }
  123.       String fileName = root+tokens[0];
  124.       long fileSize = (long)(BLOCK_SIZE*Double.parseDouble(tokens[1]));
  125.       genFile(new Path(fileName), fileSize);
  126.     }
  127.   }
  128.   
  129.   /** Create a file with the name <code>file</code> and 
  130.    * a length of <code>fileSize</code>. The file is filled with character 'a'.
  131.    */
  132.   private void genFile(Path file, long fileSize) throws IOException {
  133.     FSDataOutputStream out = fs.create(file, true, 
  134.         getConf().getInt("io.file.buffer.size", 4096),
  135.         (short)getConf().getInt("dfs.replication", 3),
  136.         fs.getDefaultBlockSize());
  137.     for(long i=0; i<fileSize; i++) {
  138.       out.writeByte('a');
  139.     }
  140.     out.close();
  141.   }
  142.   
  143.   /** Main program.
  144.    * 
  145.    * @param args Command line arguments
  146.    * @throws Exception
  147.    */
  148.   public static void main(String[] args) throws Exception {
  149.     int res = ToolRunner.run(new Configuration(),
  150.         new DataGenerator(), args);
  151.     System.exit(res);
  152.   }
  153. }