복붙노트

[HADOOP] 하나의 파일 또는 디렉토리를 처리하는 하나의 맵퍼 또는 감속기

HADOOP

하나의 파일 또는 디렉토리를 처리하는 하나의 맵퍼 또는 감속기

저는 Hadoop과 MapReduce를 처음 사용합니다. 다음과 같은 디렉토리와 파일이 있습니다 (각 파일은 10MB이며 N은 100 일 수 있습니다. 파일은 압축되거나 압축되지 않을 수 있습니다). MyDir1 / file1 MyDir1 / file2 ... MyDir1 / fileN

mydir2에 / FILE1 mydir2에 / 파일 2 ... MyDir3 / 파일

하나의 매퍼 또는 감속기가 전체 MyDir1을 처리하는 MapReduce 응용 프로그램을 설계하려고합니다. 즉, MyDir1이 여러 매퍼로 분할되는 것을 원하지 않습니다. 마찬가지로 MyDir2를 다른 매퍼 / 감속기에서 분할하지 않고 완전히 처리하기를 원합니다.

이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 나만의 InputFormat을 작성하고 입력 파일을 읽어야합니까?

해결법

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

    1.FileInputFormat # isSplitable ()을 구현하십시오. 그런 다음 입력 파일이 분할되지 않고 맵당 하나씩 처리됩니다. 매퍼가 병렬로 실행하더라도 작업을 완료하는 데 걸리는 시간은 최대 입력 파일을 처리하는 시간에 따라 다릅니다. 또한 노드 전체에 많은 데이터 셔플이 있기 때문에 이것은 효율적이지 않을 수 있습니다.

    FileInputFormat # isSplitable ()을 구현하십시오. 그런 다음 입력 파일이 분할되지 않고 맵당 하나씩 처리됩니다. 매퍼가 병렬로 실행하더라도 작업을 완료하는 데 걸리는 시간은 최대 입력 파일을 처리하는 시간에 따라 다릅니다. 또한 노드 전체에 많은 데이터 셔플이 있기 때문에 이것은 효율적이지 않을 수 있습니다.

    import org.apache.hadoop.fs.*;
    import org.apache.hadoop.mapred.TextInputFormat;
    public class NonSplittableTextInputFormat extends TextInputFormat {
        @Override
        protected boolean isSplitable(FileSystem fs, Path file) {
            return false;
        }
    }
    

    현재 API는 단일 맵퍼로 전체 디렉토리를 처리 할 수 ​​없습니다. 자신 만의 InputFormat을 작성해야 할 수도 있습니다. 또는 처리 할 디렉토리 목록을 작성하고 처리 할 각 맵퍼에 단일 디렉토리를 전달하십시오. 다시 노드 간 데이터 셔플 때문에 효율적이지 않습니다.

    리듀서로 돌아와서 입력 파일 / 디렉토리가 아니라 매퍼의 출력 KV 쌍에서 작동합니다.

  2. from https://stackoverflow.com/questions/8831303/one-mapper-or-a-reducer-to-process-one-file-or-directory by cc-by-sa and MIT license