You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by aa...@apache.org on 2016/03/30 07:02:00 UTC

hadoop git commit: MAPREDUCE-6663. [NNBench] Refactor nnbench as a Tool implementation. Contributed by Brahma Reddy Battula.

Repository: hadoop
Updated Branches:
  refs/heads/trunk 828627046 -> 690d8a368


MAPREDUCE-6663. [NNBench] Refactor nnbench as a Tool implementation. Contributed by Brahma Reddy Battula.


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/690d8a36
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/690d8a36
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/690d8a36

Branch: refs/heads/trunk
Commit: 690d8a368d3e967495eafea27659b6124989c89e
Parents: 8286270
Author: Akira Ajisaka <aa...@apache.org>
Authored: Wed Mar 30 11:42:54 2016 +0900
Committer: Akira Ajisaka <aa...@apache.org>
Committed: Wed Mar 30 11:42:54 2016 +0900

----------------------------------------------------------------------
 .../java/org/apache/hadoop/hdfs/NNBench.java    | 239 ++++++++++---------
 .../org/apache/hadoop/hdfs/TestNNBench.java     |  84 +++++++
 2 files changed, 211 insertions(+), 112 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/690d8a36/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/hdfs/NNBench.java
----------------------------------------------------------------------
diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/hdfs/NNBench.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/hdfs/NNBench.java
index 96c4710..ee3cc00 100644
--- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/hdfs/NNBench.java
+++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/hdfs/NNBench.java
@@ -25,7 +25,6 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.PrintStream;
-import java.net.InetAddress;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Iterator;
@@ -33,6 +32,7 @@ import java.util.StringTokenizer;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.HadoopIllegalArgumentException;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.conf.Configured;
 import org.apache.hadoop.fs.FSDataInputStream;
@@ -43,6 +43,7 @@ import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.io.LongWritable;
 import org.apache.hadoop.io.SequenceFile;
 import org.apache.hadoop.io.SequenceFile.CompressionType;
+import org.apache.hadoop.io.SequenceFile.Writer;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.mapred.FileInputFormat;
 import org.apache.hadoop.mapred.FileOutputFormat;
@@ -54,6 +55,8 @@ import org.apache.hadoop.mapred.OutputCollector;
 import org.apache.hadoop.mapred.Reducer;
 import org.apache.hadoop.mapred.Reporter;
 import org.apache.hadoop.mapred.SequenceFileInputFormat;
+import org.apache.hadoop.util.Tool;
+import org.apache.hadoop.util.ToolRunner;
 
 /**
  * This program executes a specified operation that applies load to 
@@ -74,49 +77,48 @@ import org.apache.hadoop.mapred.SequenceFileInputFormat;
  *       must be run before running the other operations.
  */
 
-public class NNBench {
+public class NNBench extends Configured implements Tool {
   private static final Log LOG = LogFactory.getLog(
           "org.apache.hadoop.hdfs.NNBench");
   
-  protected static String CONTROL_DIR_NAME = "control";
-  protected static String OUTPUT_DIR_NAME = "output";
-  protected static String DATA_DIR_NAME = "data";
-  protected static final String DEFAULT_RES_FILE_NAME = "NNBench_results.log";
-  protected static final String NNBENCH_VERSION = "NameNode Benchmark 0.4";
-  
-  public static String operation = "none";
-  public static long numberOfMaps = 1l; // default is 1
-  public static long numberOfReduces = 1l; // default is 1
-  public static long startTime = 
+  private static String CONTROL_DIR_NAME = "control";
+  private static String OUTPUT_DIR_NAME = "output";
+  private static String DATA_DIR_NAME = "data";
+  static final String DEFAULT_RES_FILE_NAME = "NNBench_results.log";
+  private static final String NNBENCH_VERSION = "NameNode Benchmark 0.4";
+
+  private String operation = "none";
+  private long numberOfMaps = 1l; // default is 1
+  private long numberOfReduces = 1l; // default is 1
+  private long startTime =
           System.currentTimeMillis() + (120 * 1000); // default is 'now' + 2min
-  public static long blockSize = 1l; // default is 1
-  public static int bytesToWrite = 0; // default is 0
-  public static long bytesPerChecksum = 1l; // default is 1
-  public static long numberOfFiles = 1l; // default is 1
-  public static short replicationFactorPerFile = 1; // default is 1
-  public static String baseDir = "/benchmarks/NNBench";  // default
-  public static boolean readFileAfterOpen = false; // default is to not read
-  
+  private long blockSize = 1l; // default is 1
+  private int bytesToWrite = 0; // default is 0
+  private long bytesPerChecksum = 1l; // default is 1
+  private long numberOfFiles = 1l; // default is 1
+  private short replicationFactorPerFile = 1; // default is 1
+  private String baseDir = "/benchmarks/NNBench";  // default
+  private boolean readFileAfterOpen = false; // default is to not read
+  private boolean isHelpMessage = false;
   // Supported operations
   private static final String OP_CREATE_WRITE = "create_write";
   private static final String OP_OPEN_READ = "open_read";
   private static final String OP_RENAME = "rename";
   private static final String OP_DELETE = "delete";
+  private static final int MAX_OPERATION_EXCEPTIONS = 1000;
   
   // To display in the format that matches the NN and DN log format
   // Example: 2007-10-26 00:01:19,853
   static SimpleDateFormat sdf = 
           new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss','S");
-
-  private static Configuration config = new Configuration();
   
   /**
    * Clean up the files before a test run
    * 
    * @throws IOException on error
    */
-  private static void cleanupBeforeTestrun() throws IOException {
-    FileSystem tempFS = FileSystem.get(config);
+  private void cleanupBeforeTestrun() throws IOException {
+    FileSystem tempFS = FileSystem.get(getConf());
     
     // Delete the data directory only if it is the create/write operation
     if (operation.equals(OP_CREATE_WRITE)) {
@@ -133,8 +135,7 @@ public class NNBench {
    * 
    * @throws IOException on error
    */
-  private static void createControlFiles() throws IOException {
-    FileSystem tempFS = FileSystem.get(config);
+  private void createControlFiles() throws IOException {
     LOG.info("Creating " + numberOfMaps + " control files");
 
     for (int i = 0; i < numberOfMaps; i++) {
@@ -144,8 +145,9 @@ public class NNBench {
 
       SequenceFile.Writer writer = null;
       try {
-        writer = SequenceFile.createWriter(tempFS, config, filePath, Text.class, 
-                LongWritable.class, CompressionType.NONE);
+        writer = SequenceFile.createWriter(getConf(), Writer.file(filePath),
+            Writer.keyClass(Text.class), Writer.valueClass(LongWritable.class),
+            Writer.compression(CompressionType.NONE));
         writer.append(new Text(strFileName), new LongWritable(i));
       } finally {
         if (writer != null) {
@@ -208,23 +210,23 @@ public class NNBench {
    *   line's arguments
    * @param length total number of arguments
    */
-  public static void checkArgs(final int index, final int length) {
+  private static void checkArgs(final int index, final int length) {
     if (index == length) {
       displayUsage();
-      System.exit(-1);
+      throw new HadoopIllegalArgumentException("Not enough arguments");
     }
   }
   
   /**
    * Parse input arguments
+   *  @param args array of command line's parameters to be parsed
    *
-   * @param args array of command line's parameters to be parsed
    */
-  public static void parseInputs(final String[] args) {
+  private void parseInputs(final String[] args) {
     // If there are no command line arguments, exit
     if (args.length == 0) {
       displayUsage();
-      System.exit(-1);
+      throw new HadoopIllegalArgumentException("Give valid inputs");
     }
     
     // Parse command line args
@@ -263,7 +265,7 @@ public class NNBench {
         readFileAfterOpen = Boolean.parseBoolean(args[++i]);
       } else if (args[i].equals("-help")) {
         displayUsage();
-        System.exit(-1);
+        isHelpMessage = true;
       }
     }
     
@@ -281,31 +283,30 @@ public class NNBench {
     LOG.info("     Read file after open: " + readFileAfterOpen);
     
     // Set user-defined parameters, so the map method can access the values
-    config.set("test.nnbench.operation", operation);
-    config.setLong("test.nnbench.maps", numberOfMaps);
-    config.setLong("test.nnbench.reduces", numberOfReduces);
-    config.setLong("test.nnbench.starttime", startTime);
-    config.setLong("test.nnbench.blocksize", blockSize);
-    config.setInt("test.nnbench.bytestowrite", bytesToWrite);
-    config.setLong("test.nnbench.bytesperchecksum", bytesPerChecksum);
-    config.setLong("test.nnbench.numberoffiles", numberOfFiles);
-    config.setInt("test.nnbench.replicationfactor", 
+    getConf().set("test.nnbench.operation", operation);
+    getConf().setLong("test.nnbench.maps", numberOfMaps);
+    getConf().setLong("test.nnbench.reduces", numberOfReduces);
+    getConf().setLong("test.nnbench.starttime", startTime);
+    getConf().setLong("test.nnbench.blocksize", blockSize);
+    getConf().setInt("test.nnbench.bytestowrite", bytesToWrite);
+    getConf().setLong("test.nnbench.bytesperchecksum", bytesPerChecksum);
+    getConf().setLong("test.nnbench.numberoffiles", numberOfFiles);
+    getConf().setInt("test.nnbench.replicationfactor",
             (int) replicationFactorPerFile);
-    config.set("test.nnbench.basedir", baseDir);
-    config.setBoolean("test.nnbench.readFileAfterOpen", readFileAfterOpen);
+    getConf().set("test.nnbench.basedir", baseDir);
+    getConf().setBoolean("test.nnbench.readFileAfterOpen", readFileAfterOpen);
 
-    config.set("test.nnbench.datadir.name", DATA_DIR_NAME);
-    config.set("test.nnbench.outputdir.name", OUTPUT_DIR_NAME);
-    config.set("test.nnbench.controldir.name", CONTROL_DIR_NAME);
+    getConf().set("test.nnbench.datadir.name", DATA_DIR_NAME);
+    getConf().set("test.nnbench.outputdir.name", OUTPUT_DIR_NAME);
+    getConf().set("test.nnbench.controldir.name", CONTROL_DIR_NAME);
   }
   
   /**
    * Analyze the results
-   * 
    * @throws IOException on error
    */
-  private static void analyzeResults() throws IOException {
-    final FileSystem fs = FileSystem.get(config);
+  private int analyzeResults() throws IOException {
+    final FileSystem fs = FileSystem.get(getConf());
     Path reduceDir = new Path(baseDir, OUTPUT_DIR_NAME);
 
     long totalTimeAL1 = 0l;
@@ -322,32 +323,31 @@ public class NNBench {
     for (FileStatus status : fss) {
 
       Path reduceFile = status.getPath();
-      DataInputStream in;
-      in = new DataInputStream(fs.open(reduceFile));
-
-      BufferedReader lines;
-      lines = new BufferedReader(new InputStreamReader(in));
-
-      String line;
-      while ((line = lines.readLine()) != null) {
-        StringTokenizer tokens = new StringTokenizer(line, " \t\n\r\f%;");
-        String attr = tokens.nextToken();
-        if (attr.endsWith(":totalTimeAL1")) {
-          totalTimeAL1 = Long.parseLong(tokens.nextToken());
-        } else if (attr.endsWith(":totalTimeAL2")) {
-          totalTimeAL2 = Long.parseLong(tokens.nextToken());
-        } else if (attr.endsWith(":totalTimeTPmS")) {
-          totalTimeTPmS = Long.parseLong(tokens.nextToken());
-        } else if (attr.endsWith(":latemaps")) {
-          lateMaps = Long.parseLong(tokens.nextToken());
-        } else if (attr.endsWith(":numOfExceptions")) {
-          numOfExceptions = Long.parseLong(tokens.nextToken());
-        } else if (attr.endsWith(":successfulFileOps")) {
-          successfulFileOps = Long.parseLong(tokens.nextToken());
-        } else if (attr.endsWith(":mapStartTimeTPmS")) {
-          mapStartTimeTPmS = Long.parseLong(tokens.nextToken());
-        } else if (attr.endsWith(":mapEndTimeTPmS")) {
-          mapEndTimeTPmS = Long.parseLong(tokens.nextToken());
+      try (DataInputStream in = new DataInputStream(fs.open(reduceFile));
+          BufferedReader lines =
+              new BufferedReader(new InputStreamReader(in))) {
+
+        String line;
+        while ((line = lines.readLine()) != null) {
+          StringTokenizer tokens = new StringTokenizer(line, " \t\n\r\f%;");
+          String attr = tokens.nextToken();
+          if (attr.endsWith(":totalTimeAL1")) {
+            totalTimeAL1 = Long.parseLong(tokens.nextToken());
+          } else if (attr.endsWith(":totalTimeAL2")) {
+            totalTimeAL2 = Long.parseLong(tokens.nextToken());
+          } else if (attr.endsWith(":totalTimeTPmS")) {
+            totalTimeTPmS = Long.parseLong(tokens.nextToken());
+          } else if (attr.endsWith(":latemaps")) {
+            lateMaps = Long.parseLong(tokens.nextToken());
+          } else if (attr.endsWith(":numOfExceptions")) {
+            numOfExceptions = Long.parseLong(tokens.nextToken());
+          } else if (attr.endsWith(":successfulFileOps")) {
+            successfulFileOps = Long.parseLong(tokens.nextToken());
+          } else if (attr.endsWith(":mapStartTimeTPmS")) {
+            mapStartTimeTPmS = Long.parseLong(tokens.nextToken());
+          } else if (attr.endsWith(":mapEndTimeTPmS")) {
+            mapEndTimeTPmS = Long.parseLong(tokens.nextToken());
+          }
         }
       }
     }
@@ -444,25 +444,29 @@ public class NNBench {
     "             RAW DATA: # of exceptions: " + numOfExceptions,
     "" };
 
-    PrintStream res = new PrintStream(new FileOutputStream(
-            new File(DEFAULT_RES_FILE_NAME), true));
-    
-    // Write to a file and also dump to log
-    for(int i = 0; i < resultLines.length; i++) {
-      LOG.info(resultLines[i]);
-      res.println(resultLines[i]);
+    try (PrintStream res = new PrintStream(
+        new FileOutputStream(new File(DEFAULT_RES_FILE_NAME), true))) {
+      // Write to a file and also dump to log
+      for (String resultLine : resultLines) {
+        LOG.info(resultLine);
+        res.println(resultLine);
+      }
+    }
+    if(numOfExceptions >= MAX_OPERATION_EXCEPTIONS){
+      return -1;
     }
+    return 0;
   }
-  
+
   /**
    * Run the test
    * 
    * @throws IOException on error
    */
-  public static void runTests() throws IOException {
-    config.setLong("io.bytes.per.checksum", bytesPerChecksum);
+  private void runTests() throws IOException {
+    getConf().setLong("io.bytes.per.checksum", bytesPerChecksum);
     
-    JobConf job = new JobConf(config, NNBench.class);
+    JobConf job = new JobConf(getConf(), NNBench.class);
 
     job.setJobName("NNBench-" + operation);
     FileInputFormat.setInputPaths(job, new Path(baseDir, CONTROL_DIR_NAME));
@@ -487,7 +491,7 @@ public class NNBench {
   /**
    * Validate the inputs
    */
-  public static void validateInputs() {
+  private void validateInputs() {
     // If it is not one of the four operations, then fail
     if (!operation.equals(OP_CREATE_WRITE) &&
             !operation.equals(OP_OPEN_READ) &&
@@ -495,7 +499,8 @@ public class NNBench {
             !operation.equals(OP_DELETE)) {
       System.err.println("Error: Unknown operation: " + operation);
       displayUsage();
-      System.exit(-1);
+      throw new HadoopIllegalArgumentException(
+          "Error: Unknown operation: " + operation);
     }
     
     // If number of maps is a negative number, then fail
@@ -503,57 +508,66 @@ public class NNBench {
     if (numberOfMaps < 0) {
       System.err.println("Error: Number of maps must be a positive number");
       displayUsage();
-      System.exit(-1);
+      throw new HadoopIllegalArgumentException(
+          "Error: Number of maps must be a positive number");
     }
     
     // If number of reduces is a negative number or 0, then fail
     if (numberOfReduces <= 0) {
       System.err.println("Error: Number of reduces must be a positive number");
       displayUsage();
-      System.exit(-1);
+      throw new HadoopIllegalArgumentException(
+          "Error: Number of reduces must be a positive number");
     }
 
     // If blocksize is a negative number or 0, then fail
     if (blockSize <= 0) {
       System.err.println("Error: Block size must be a positive number");
       displayUsage();
-      System.exit(-1);
+      throw new HadoopIllegalArgumentException(
+          "Error: Block size must be a positive number");
     }
     
     // If bytes to write is a negative number, then fail
     if (bytesToWrite < 0) {
       System.err.println("Error: Bytes to write must be a positive number");
       displayUsage();
-      System.exit(-1);
+      throw new HadoopIllegalArgumentException(
+          "Error: Bytes to write must be a positive number");
     }
     
     // If bytes per checksum is a negative number, then fail
     if (bytesPerChecksum < 0) {
       System.err.println("Error: Bytes per checksum must be a positive number");
       displayUsage();
-      System.exit(-1);
+      throw new HadoopIllegalArgumentException(
+          "Error: Bytes per checksum must be a positive number");
     }
     
     // If number of files is a negative number, then fail
     if (numberOfFiles < 0) {
       System.err.println("Error: Number of files must be a positive number");
       displayUsage();
-      System.exit(-1);
+      throw new HadoopIllegalArgumentException(
+          "Error: Number of files must be a positive number");
     }
     
     // If replication factor is a negative number, then fail
     if (replicationFactorPerFile < 0) {
       System.err.println("Error: Replication factor must be a positive number");
       displayUsage();
-      System.exit(-1);
+      throw new HadoopIllegalArgumentException(
+          "Error: Replication factor must be a positive number");
     }
     
     // If block size is not a multiple of bytesperchecksum, fail
     if (blockSize % bytesPerChecksum != 0) {
-      System.err.println("Error: Block Size in bytes must be a multiple of " +
-              "bytes per checksum: ");
+      System.err.println("Error: Block Size in bytes must be a multiple of "
+          + "bytes per checksum: ");
       displayUsage();
-      System.exit(-1);
+      throw new HadoopIllegalArgumentException(
+          "Error: Block Size in bytes must be a multiple of "
+              + "bytes per checksum:");
     }
   }
   /**
@@ -562,13 +576,22 @@ public class NNBench {
   * @param args array of command line arguments
   * @throws IOException indicates a problem with test startup
   */
-  public static void main(String[] args) throws IOException {
+  public static void main(String[] args) throws Exception {
+    int res = ToolRunner.run(new NNBench(), args);
+    System.exit(res);
+  }
+
+  @Override
+  public int run(String[] args) throws Exception {
     // Display the application version string
     displayVersion();
 
     // Parse the inputs
     parseInputs(args);
-    
+    if (isHelpMessage) {
+      return 0;
+    }
+
     // Validate inputs
     validateInputs();
     
@@ -582,7 +605,7 @@ public class NNBench {
     runTests();
     
     // Analyze results
-    analyzeResults();
+    return analyzeResults();
   }
 
   
@@ -592,7 +615,6 @@ public class NNBench {
   static class NNBenchMapper extends Configured
           implements Mapper<Text, LongWritable, Text, Text> {
     FileSystem filesystem = null;
-    private String hostName = null;
 
     long numberOfFiles = 1l;
     long blkSize = 1l;
@@ -602,7 +624,6 @@ public class NNBench {
     String dataDirName = null;
     String op = null;
     boolean readFile = false;
-    final int MAX_OPERATION_EXCEPTIONS = 1000;
     
     // Data to collect from the operation
     int numOfExceptions = 0;
@@ -628,12 +649,6 @@ public class NNBench {
       } catch(Exception e) {
         throw new RuntimeException("Cannot get file system.", e);
       }
-      
-      try {
-        hostName = InetAddress.getLocalHost().getHostName();
-      } catch(Exception e) {
-        throw new RuntimeException("Error getting hostname", e);
-      }
     }
     
     /**
@@ -678,7 +693,7 @@ public class NNBench {
             LongWritable value,
             OutputCollector<Text, Text> output,
             Reporter reporter) throws IOException {
-      Configuration conf = filesystem.getConf();
+      Configuration conf = getConf();
       
       numberOfFiles = conf.getLong("test.nnbench.numberoffiles", 1l);
       blkSize = conf.getLong("test.nnbench.blocksize", 1l);

http://git-wip-us.apache.org/repos/asf/hadoop/blob/690d8a36/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/hdfs/TestNNBench.java
----------------------------------------------------------------------
diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/hdfs/TestNNBench.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/hdfs/TestNNBench.java
new file mode 100644
index 0000000..9f9814d
--- /dev/null
+++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/hdfs/TestNNBench.java
@@ -0,0 +1,84 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hdfs;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.mapred.HadoopTestCase;
+import org.apache.hadoop.util.Time;
+import org.apache.hadoop.util.ToolRunner;
+import org.junit.After;
+import org.junit.Test;
+
+public class TestNNBench extends HadoopTestCase {
+  private static final String BASE_DIR =
+      new File(System.getProperty("test.build.data", "build/test/data"),
+          "NNBench").getAbsolutePath();
+
+  public TestNNBench() throws IOException {
+    super(LOCAL_MR, LOCAL_FS, 1, 1);
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    getFileSystem().delete(new Path(BASE_DIR), true);
+    getFileSystem().delete(new Path(NNBench.DEFAULT_RES_FILE_NAME), true);
+    super.tearDown();
+  }
+
+  @Test(timeout = 30000)
+  public void testNNBenchCreateReadAndDelete() throws Exception {
+    runNNBench(createJobConf(), "create_write");
+    Path path = new Path(BASE_DIR + "/data/file_0_0");
+    assertTrue("create_write should create the file",
+        getFileSystem().exists(path));
+    runNNBench(createJobConf(), "open_read");
+    runNNBench(createJobConf(), "delete");
+    assertFalse("Delete operation should delete the file",
+        getFileSystem().exists(path));
+  }
+
+  @Test(timeout = 30000)
+  public void testNNBenchCreateAndRename() throws Exception {
+    runNNBench(createJobConf(), "create_write");
+    Path path = new Path(BASE_DIR + "/data/file_0_0");
+    assertTrue("create_write should create the file",
+        getFileSystem().exists(path));
+    runNNBench(createJobConf(), "rename");
+    Path renamedPath = new Path(BASE_DIR + "/data/file_0_r_0");
+    assertFalse("Rename should rename the file", getFileSystem().exists(path));
+    assertTrue("Rename should rename the file",
+        getFileSystem().exists(renamedPath));
+  }
+
+  private void runNNBench(Configuration conf, String operation)
+      throws Exception {
+    String[] genArgs = { "-operation", operation, "-baseDir", BASE_DIR,
+        "-startTime", "" + (Time.now() / 1000 + 3) };
+
+    assertEquals(0, ToolRunner.run(conf, new NNBench(), genArgs));
+  }
+
+}