TestMultipleTextOutputFormat.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.mapred;
  19. import java.io.*;
  20. import junit.framework.TestCase;
  21. import org.apache.hadoop.fs.*;
  22. import org.apache.hadoop.io.*;
  23. import org.apache.hadoop.mapred.lib.*;
  24. public class TestMultipleTextOutputFormat extends TestCase {
  25.   private static JobConf defaultConf = new JobConf();
  26.   private static FileSystem localFs = null;
  27.   static {
  28.     try {
  29.       localFs = FileSystem.getLocal(defaultConf);
  30.     } catch (IOException e) {
  31.       throw new RuntimeException("init failure", e);
  32.     }
  33.   }
  34.   // A random task attempt id for testing.
  35.   private static String attempt = "attempt_200707121733_0001_m_000000_0";
  36.   private static Path workDir = 
  37.     new Path(new Path(
  38.                       new Path(System.getProperty("test.build.data", "."), 
  39.                                "data"), 
  40.                       FileOutputCommitter.TEMP_DIR_NAME), "_" + attempt);
  41.   private static void writeData(RecordWriter<Text, Text> rw) throws IOException {
  42.     for (int i = 10; i < 40; i++) {
  43.       String k = "" + i;
  44.       String v = "" + i;
  45.       rw.write(new Text(k), new Text(v));
  46.     }
  47.   }
  48.   
  49.   static class KeyBasedMultipleTextOutputFormat extends MultipleTextOutputFormat<Text, Text> {
  50.     protected String generateFileNameForKeyValue(Text key, Text v, String name) {
  51.       
  52.       return key.toString().substring(0, 1) + "-" + name;
  53.     }
  54.   }
  55.   
  56.   private static void test1(JobConf job) throws IOException {
  57.     FileSystem fs = FileSystem.getLocal(job);
  58.     String name = "part-00000";
  59.     KeyBasedMultipleTextOutputFormat theOutputFormat = new KeyBasedMultipleTextOutputFormat();
  60.     RecordWriter<Text, Text> rw = theOutputFormat.getRecordWriter(fs, job, name, null);
  61.     writeData(rw);
  62.     rw.close(null);
  63.   }
  64.   
  65.   private static void test2(JobConf job) throws IOException {
  66.     FileSystem fs = FileSystem.getLocal(job);
  67.     String name = "part-00000";
  68.     //pretend that we have input file with 1/2/3 as the suffix
  69.     job.set("map.input.file", "1/2/3");
  70.     // we use the last two legs of the input file as the output file
  71.     job.set("mapred.outputformat.numOfTrailingLegs", "2");
  72.     MultipleTextOutputFormat<Text, Text> theOutputFormat = new MultipleTextOutputFormat<Text, Text>();
  73.     RecordWriter<Text, Text> rw = theOutputFormat.getRecordWriter(fs, job, name, null);
  74.     writeData(rw);
  75.     rw.close(null);
  76.   }
  77.   
  78.   public void testFormat() throws Exception {
  79.     JobConf job = new JobConf();
  80.     job.set("mapred.task.id", attempt);
  81.     FileOutputFormat.setOutputPath(job, workDir.getParent().getParent());
  82.     FileOutputFormat.setWorkOutputPath(job, workDir);
  83.     FileSystem fs = workDir.getFileSystem(job);
  84.     if (!fs.mkdirs(workDir)) {
  85.       fail("Failed to create output directory");
  86.     }
  87.     //System.out.printf("workdir: %sn", workDir.toString());
  88.     TestMultipleTextOutputFormat.test1(job);
  89.     TestMultipleTextOutputFormat.test2(job);
  90.     String file_11 = "1-part-00000";
  91.     
  92.     File expectedFile_11 = new File(new Path(workDir, file_11).toString()); 
  93.     //System.out.printf("expectedFile_11: %sn", new Path(workDir, file_11).toString());
  94.     StringBuffer expectedOutput = new StringBuffer();
  95.     for (int i = 10; i < 20; i++) {
  96.       expectedOutput.append(""+i).append('t').append(""+i).append("n");
  97.     }
  98.     String output = UtilsForTests.slurp(expectedFile_11);
  99.     //System.out.printf("File_2 output: %sn", output);
  100.     assertEquals(output, expectedOutput.toString());
  101.     
  102.     String file_12 = "2-part-00000";
  103.     
  104.     File expectedFile_12 = new File(new Path(workDir, file_12).toString()); 
  105.     //System.out.printf("expectedFile_12: %sn", new Path(workDir, file_12).toString());
  106.     expectedOutput = new StringBuffer();
  107.     for (int i = 20; i < 30; i++) {
  108.       expectedOutput.append(""+i).append('t').append(""+i).append("n");
  109.     }
  110.     output = UtilsForTests.slurp(expectedFile_12);
  111.     //System.out.printf("File_2 output: %sn", output);
  112.     assertEquals(output, expectedOutput.toString());
  113.     
  114.     String file_13 = "3-part-00000";
  115.     
  116.     File expectedFile_13 = new File(new Path(workDir, file_13).toString()); 
  117.     //System.out.printf("expectedFile_13: %sn", new Path(workDir, file_13).toString());
  118.     expectedOutput = new StringBuffer();
  119.     for (int i = 30; i < 40; i++) {
  120.       expectedOutput.append(""+i).append('t').append(""+i).append("n");
  121.     }
  122.     output = UtilsForTests.slurp(expectedFile_13);
  123.     //System.out.printf("File_2 output: %sn", output);
  124.     assertEquals(output, expectedOutput.toString());
  125.     
  126.     String file_2 = "2/3";
  127.     
  128.     File expectedFile_2 = new File(new Path(workDir, file_2).toString()); 
  129.     //System.out.printf("expectedFile_2: %sn", new Path(workDir, file_2).toString());
  130.     expectedOutput = new StringBuffer();
  131.     for (int i = 10; i < 40; i++) {
  132.       expectedOutput.append(""+i).append('t').append(""+i).append("n");
  133.     }
  134.     output = UtilsForTests.slurp(expectedFile_2);
  135.     //System.out.printf("File_2 output: %sn", output);
  136.     assertEquals(output, expectedOutput.toString());
  137.   }
  138.   public static void main(String[] args) throws Exception {
  139.     new TestMultipleTextOutputFormat().testFormat();
  140.   }
  141. }