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

网格计算

开发平台:

Java

  1. package org.apache.hadoop.hdfs.server.namenode;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.util.Iterator;
  5. import java.util.List;
  6. import java.util.Random;
  7. import junit.framework.TestCase;
  8. import org.apache.commons.logging.Log;
  9. import org.apache.commons.logging.LogFactory;
  10. import org.apache.hadoop.conf.Configuration;
  11. import org.apache.hadoop.fs.FSDataOutputStream;
  12. import org.apache.hadoop.fs.FileSystem;
  13. import org.apache.hadoop.fs.FileUtil;
  14. import org.apache.hadoop.fs.Path;
  15. import org.apache.hadoop.hdfs.MiniDFSCluster;
  16. import org.apache.hadoop.hdfs.server.common.HdfsConstants.StartupOption;
  17. import org.apache.hadoop.hdfs.server.common.Storage.StorageDirectory;
  18. import org.apache.hadoop.hdfs.server.namenode.FSImage.NameNodeDirType;
  19. import org.apache.hadoop.hdfs.server.namenode.FSImage.NameNodeFile;
  20. import org.apache.hadoop.util.StringUtils;
  21. /**
  22.  * Startup and checkpoint tests
  23.  * 
  24.  */
  25. public class TestStartup extends TestCase {
  26.   public static final String NAME_NODE_HOST = "localhost:";
  27.   public static final String NAME_NODE_HTTP_HOST = "0.0.0.0:";
  28.   private static final Log LOG =
  29.     LogFactory.getLog(TestStartup.class.getName());
  30.   private Configuration config;
  31.   private File hdfsDir=null;
  32.   static final long seed = 0xAAAAEEFL;
  33.   static final int blockSize = 4096;
  34.   static final int fileSize = 8192;
  35.   private long editsLength=0, fsimageLength=0;
  36.   private void writeFile(FileSystem fileSys, Path name, int repl)
  37.   throws IOException {
  38.     FSDataOutputStream stm = fileSys.create(name, true,
  39.         fileSys.getConf().getInt("io.file.buffer.size", 4096),
  40.         (short)repl, (long)blockSize);
  41.     byte[] buffer = new byte[fileSize];
  42.     Random rand = new Random(seed);
  43.     rand.nextBytes(buffer);
  44.     stm.write(buffer);
  45.     stm.close();
  46.   }
  47.   protected void setUp() throws Exception {
  48.     config = new Configuration();
  49.     String baseDir = System.getProperty("test.build.data", "/tmp");
  50.     hdfsDir = new File(baseDir, "dfs");
  51.     if ( hdfsDir.exists() && !FileUtil.fullyDelete(hdfsDir) ) {
  52.       throw new IOException("Could not delete hdfs directory '" + hdfsDir + "'");
  53.     }
  54.     LOG.info("--hdfsdir is " + hdfsDir.getAbsolutePath());
  55.     config.set("dfs.name.dir", new File(hdfsDir, "name").getPath());
  56.     config.set("dfs.data.dir", new File(hdfsDir, "data").getPath());
  57.     config.set("fs.checkpoint.dir",new File(hdfsDir, "secondary").getPath());
  58.     //config.set("fs.default.name", "hdfs://"+ NAME_NODE_HOST + "0");
  59.     
  60.     FileSystem.setDefaultUri(config, "hdfs://"+NAME_NODE_HOST + "0");
  61.   }
  62.   /**
  63.    * clean up
  64.    */
  65.   public void tearDown() throws Exception {
  66.     if ( hdfsDir.exists() && !FileUtil.fullyDelete(hdfsDir) ) {
  67.       throw new IOException("Could not delete hdfs directory in tearDown '" + hdfsDir + "'");
  68.     }
  69.   }
  70.    /**
  71.    * start MiniDFScluster, create a file (to create edits) and do a checkpoint  
  72.    * @throws IOException
  73.    */
  74.   public void createCheckPoint() throws IOException {
  75.     LOG.info("--starting mini cluster");
  76.     // manage dirs parameter set to false 
  77.     MiniDFSCluster cluster = null;
  78.     SecondaryNameNode sn = null;
  79.     
  80.     try {
  81.       cluster = new MiniDFSCluster(0, config, 1, true, false, false,  null, null, null, null);
  82.       cluster.waitActive();
  83.       LOG.info("--starting Secondary Node");
  84.       // start secondary node
  85.       sn = new SecondaryNameNode(config);
  86.       assertNotNull(sn);
  87.       // create a file
  88.       FileSystem fileSys = cluster.getFileSystem();
  89.       Path file1 = new Path("t1");
  90.       this.writeFile(fileSys, file1, 1);
  91.       LOG.info("--doing checkpoint");
  92.       sn.doCheckpoint();  // this shouldn't fail
  93.       LOG.info("--done checkpoint");
  94.     } catch (IOException e) {
  95.       fail(StringUtils.stringifyException(e));
  96.       System.err.println("checkpoint failed");
  97.       throw e;
  98.     }  finally {
  99.       if(sn!=null)
  100.         sn.shutdown();
  101.       if(cluster!=null) 
  102.         cluster.shutdown();
  103.       LOG.info("--file t1 created, cluster shutdown");
  104.     }
  105.   }
  106.   /*
  107.    * corrupt files by removing and recreating the directory
  108.    */
  109.   private void corruptNameNodeFiles() throws IOException {
  110.     // now corrupt/delete the directrory
  111.     List<File> nameDirs = (List<File>)FSNamesystem.getNamespaceDirs(config);
  112.     List<File> nameEditsDirs = (List<File>)FSNamesystem.getNamespaceEditsDirs(config);
  113.     // get name dir and its length, then delete and recreate the directory
  114.     File dir = nameDirs.get(0); // has only one
  115.     this.fsimageLength = new File(new File(dir, "current"), 
  116.         NameNodeFile.IMAGE.getName()).length();
  117.     if(dir.exists() && !(FileUtil.fullyDelete(dir)))
  118.       throw new IOException("Cannot remove directory: " + dir);
  119.     LOG.info("--removed dir "+dir + ";len was ="+ this.fsimageLength);
  120.     if (!dir.mkdirs())
  121.       throw new IOException("Cannot create directory " + dir);
  122.     dir = nameEditsDirs.get(0); //has only one
  123.     this.editsLength = new File(new File(dir, "current"), 
  124.         NameNodeFile.EDITS.getName()).length();
  125.     if(dir.exists() && !(FileUtil.fullyDelete(dir)))
  126.       throw new IOException("Cannot remove directory: " + dir);
  127.     if (!dir.mkdirs())
  128.       throw new IOException("Cannot create directory " + dir);
  129.     LOG.info("--removed dir and recreated "+dir + ";len was ="+ this.editsLength);
  130.   }
  131.   /**
  132.    * start with -importCheckpoint option and verify that the files are in separate directories and of the right length
  133.    * @throws IOException
  134.    */
  135.   private void checkNameNodeFiles() throws IOException{
  136.     // start namenode with import option
  137.     LOG.info("-- about to start DFS cluster");
  138.     MiniDFSCluster cluster = null;
  139.     try {
  140.       cluster = new MiniDFSCluster(0, config, 1, false, false, false,  StartupOption.IMPORT, null, null, null);
  141.       cluster.waitActive();
  142.       LOG.info("--NN started with checkpoint option");
  143.       NameNode nn = cluster.getNameNode();
  144.       assertNotNull(nn);
  145.       // Verify that image file sizes did not change.
  146.       FSImage image = nn.getFSImage();
  147.       verifyDifferentDirs(image, this.fsimageLength, this.editsLength);
  148.     } finally {
  149.       if(cluster != null)
  150.         cluster.shutdown();
  151.     }
  152.   }
  153.   /**
  154.    * verify that edits log and fsimage are in different directories and of a correct size
  155.    */
  156.   private void verifyDifferentDirs(FSImage img, long expectedImgSize, long expectedEditsSize) {
  157.     StorageDirectory sd =null;
  158.     for (Iterator<StorageDirectory> it = img.dirIterator(); it.hasNext();) {
  159.       sd = it.next();
  160.       if(sd.getStorageDirType().isOfType(NameNodeDirType.IMAGE)) {
  161.         File imf = FSImage.getImageFile(sd, NameNodeFile.IMAGE);
  162.         LOG.info("--image file " + imf.getAbsolutePath() + "; len = " + imf.length() + "; expected = " + expectedImgSize);
  163.         assertEquals(expectedImgSize, imf.length());
  164.       } else if(sd.getStorageDirType().isOfType(NameNodeDirType.EDITS)) {
  165.         File edf = FSImage.getImageFile(sd, NameNodeFile.EDITS);
  166.         LOG.info("-- edits file " + edf.getAbsolutePath() + "; len = " + edf.length()  + "; expected = " + expectedEditsSize);
  167.         assertEquals(expectedEditsSize, edf.length());
  168.       } else {
  169.         fail("Image/Edits directories are not different");
  170.       }
  171.     }
  172.   }
  173.   /**
  174.    * secnn-6
  175.    * checkpoint for edits and image is the same directory
  176.    * @throws IOException
  177.    */
  178.   public void testChkpointStartup2() throws IOException{
  179.     LOG.info("--starting checkpointStartup2 - same directory for checkpoint");
  180.     // different name dirs
  181.     config.set("dfs.name.dir", new File(hdfsDir, "name").getPath());
  182.     config.set("dfs.name.edits.dir", new File(hdfsDir, "edits").getPath());
  183.     // same checkpoint dirs
  184.     config.set("fs.checkpoint.edits.dir", new File(hdfsDir, "chkpt").getPath());
  185.     config.set("fs.checkpoint.dir", new File(hdfsDir, "chkpt").getPath());
  186.     createCheckPoint();
  187.     corruptNameNodeFiles();
  188.     checkNameNodeFiles();
  189.   }
  190.   /**
  191.    * seccn-8
  192.    * checkpoint for edits and image are different directories 
  193.    * @throws IOException
  194.    */
  195.   public void testChkpointStartup1() throws IOException{
  196.     //setUpConfig();
  197.     LOG.info("--starting testStartup Recovery");
  198.     // different name dirs
  199.     config.set("dfs.name.dir", new File(hdfsDir, "name").getPath());
  200.     config.set("dfs.name.edits.dir", new File(hdfsDir, "edits").getPath());
  201.     // same checkpoint dirs
  202.     config.set("fs.checkpoint.edits.dir", new File(hdfsDir, "chkpt_edits").getPath());
  203.     config.set("fs.checkpoint.dir", new File(hdfsDir, "chkpt").getPath());
  204.     createCheckPoint();
  205.     corruptNameNodeFiles();
  206.     checkNameNodeFiles();
  207.   }
  208.   /**
  209.    * secnn-7
  210.    * secondary node copies fsimage and edits into correct separate directories.
  211.    * @throws IOException
  212.    */
  213.   public void testSNNStartup() throws IOException{
  214.     //setUpConfig();
  215.     LOG.info("--starting SecondNN startup test");
  216.     // different name dirs
  217.     config.set("dfs.name.dir", new File(hdfsDir, "name").getPath());
  218.     config.set("dfs.name.edits.dir", new File(hdfsDir, "name").getPath());
  219.     // same checkpoint dirs
  220.     config.set("fs.checkpoint.edits.dir", new File(hdfsDir, "chkpt_edits").getPath());
  221.     config.set("fs.checkpoint.dir", new File(hdfsDir, "chkpt").getPath());
  222.     LOG.info("--starting NN ");
  223.     MiniDFSCluster cluster = null;
  224.     SecondaryNameNode sn = null;
  225.     NameNode nn = null;
  226.     try {
  227.       cluster = new MiniDFSCluster(0, config, 1, true, false, false,  null, null, null, null);
  228.       cluster.waitActive();
  229.       nn = cluster.getNameNode();
  230.       assertNotNull(nn);
  231.       // start secondary node
  232.       LOG.info("--starting SecondNN");
  233.       sn = new SecondaryNameNode(config);
  234.       assertNotNull(sn);
  235.       LOG.info("--doing checkpoint");
  236.       sn.doCheckpoint();  // this shouldn't fail
  237.       LOG.info("--done checkpoint");
  238.       // now verify that image and edits are created in the different directories
  239.       FSImage image = nn.getFSImage();
  240.       StorageDirectory sd = image.getStorageDir(0); //only one
  241.       assertEquals(sd.getStorageDirType(), NameNodeDirType.IMAGE_AND_EDITS);
  242.       File imf = FSImage.getImageFile(sd, NameNodeFile.IMAGE);
  243.       File edf = FSImage.getImageFile(sd, NameNodeFile.EDITS);
  244.       LOG.info("--image file " + imf.getAbsolutePath() + "; len = " + imf.length());
  245.       LOG.info("--edits file " + edf.getAbsolutePath() + "; len = " + edf.length());
  246.       FSImage chkpImage = sn.getFSImage();
  247.       verifyDifferentDirs(chkpImage, imf.length(), edf.length());
  248.     } catch (IOException e) {
  249.       fail(StringUtils.stringifyException(e));
  250.       System.err.println("checkpoint failed");
  251.       throw e;
  252.     } finally {
  253.       if(sn!=null)
  254.         sn.shutdown();
  255.       if(cluster!=null)
  256.         cluster.shutdown();
  257.     }
  258.   }
  259. }