복붙노트

[HADOOP] 어떻게 사용자 정의 RecordReader 및 InputFormat 클래스의 단위 테스트를 수행합니까?

HADOOP

어떻게 사용자 정의 RecordReader 및 InputFormat 클래스의 단위 테스트를 수행합니까?

나는 map-reduce 프로그램을 개발했다. 사용자 정의 RecordReader 및 InputFormat 클래스를 작성했습니다.

매퍼 (mapper)와 감속기 (reducer)의 단위 테스트를 위해 MR 유닛 (MR Unit)과 모키토 (Mockito)를 사용하고 있습니다.

단위 테스트 RecordReader 및 InputFormat 클래스를 단위 테스트하는 방법을 알고 싶습니다. 이 클래스들을 테스트하는 가장 좋은 방법은 무엇입니까?

해결법

  1. ==============================

    1.user7610 덕분에

    user7610 덕분에

    컴파일 된 및 다소 테스트 버전의 예제 코드에서 대답

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.mapreduce.InputFormat;
    import org.apache.hadoop.mapreduce.RecordReader;
    import org.apache.hadoop.mapreduce.TaskAttemptContext;
    import org.apache.hadoop.mapreduce.TaskAttemptID;
    import org.apache.hadoop.mapreduce.lib.input.FileSplit;
    import org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl;
    import org.apache.hadoop.util.ReflectionUtils;
    import java.io.File;
    
    Configuration conf = new Configuration(false);
    conf.set("fs.default.name", "file:///");
    
    File testFile = new File("path/to/file");
    Path path = new Path(testFile.getAbsoluteFile().toURI());
    FileSplit split = new FileSplit(path, 0, testFile.length(), null);
    
    InputFormat inputFormat = ReflectionUtils.newInstance(MyInputFormat.class, conf);
    TaskAttemptContext context = new TaskAttemptContextImpl(conf, new TaskAttemptID());
    RecordReader reader = inputFormat.createRecordReader(split, context);
    
    reader.initialize(split, context);
    
  2. ==============================

    2.사용할 수있는 테스트 파일이 필요할 것입니다. 입력 형식이 FileInputFormat을 확장한다고 가정합니다. 이것을 가지고 있으면 LocalFileSystem (fs.default.name 또는 fs.defaultFS가 file : ///으로 설정된)을 사용하도록 Configuration 객체를 구성 할 수 있습니다. 마지막으로 파일의 경로, 오프셋 및 길이 (파일의 일부)로 FileSplit을 정의해야합니다.

    사용할 수있는 테스트 파일이 필요할 것입니다. 입력 형식이 FileInputFormat을 확장한다고 가정합니다. 이것을 가지고 있으면 LocalFileSystem (fs.default.name 또는 fs.defaultFS가 file : ///으로 설정된)을 사용하도록 Configuration 객체를 구성 할 수 있습니다. 마지막으로 파일의 경로, 오프셋 및 길이 (파일의 일부)로 FileSplit을 정의해야합니다.

    // DISCLAIMER: untested or compiled
    Configuration conf = new Configuration(false);
    conf.set("fs.default.name", "file:///");
    
    File testFile = new File("path/to/file");
    FileSplit split = new FileSplit(
           testFile.getAbsoluteFile().toURI().toString(), 0, 
           testFile.getLength(), null); 
    
    MyInputFormat inputFormat = ReflectionUtils.newInstance(Myinputformat.class, conf);
    RecordReader reader = inputFormat.createRecordReader(split, 
           new TaskAttemptContext(conf, new TaskAttemptID()));
    

    이제 독자가 반환 한 레코드가 예상 한 것과 일치한다고 주장 할 수 있습니다. 파일의 압축 된 버전을 만드는 것뿐만 아니라 분할의 오프셋과 길이를 변경하여 테스트해야합니다 (파일 형식이 지원하는지 여부).

  3. from https://stackoverflow.com/questions/20371953/how-to-do-unit-testing-of-custom-recordreader-and-inputformat-classes by cc-by-sa and MIT license