복붙노트

[HADOOP] Hadoop MapReduce - 각 입력에 대해 하나의 출력 파일

HADOOP

Hadoop MapReduce - 각 입력에 대해 하나의 출력 파일

저는 Hadoop을 처음 사용하고 있으며 어떻게 작동하는지 파악하려고합니다. 운동에 관해서는 WordCount-Example과 비슷한 것을 구현해야합니다. 작업은 여러 파일을 읽고 WordCount를 수행하고 각 입력 파일에 대한 출력 파일을 작성하는 것입니다. Hadoop은 결합자를 사용하고지도 파트의 출력을 감속기의 입력으로 섞은 다음 하나의 출력 파일을 작성합니다 (실행중인 각 인스턴스에 대해 추측합니다). 각 입력 파일에 대해 하나의 출력 파일을 작성할 수 있는지 궁금 해서요. 그래서 inputfile1의 단어를 유지하고 결과를 outputfile1에 작성하는 등등. Combiner-Class를 덮어 쓰는 것이 가능합니까 아니면 다른 해결책이 있습니까? (이것이 Hadoop-Task에서 해결되어야할지 모르겠지만 이것은 운동입니다).

감사...

해결법

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

    1.map.input.file 환경 매개 변수에는 맵퍼가 처리중인 파일 이름이 있습니다. 매퍼에서이 값을 가져 와서 이것을 매퍼의 출력 키로 사용한 다음 단일 파일에서 모든 k / v를 하나의 감속기로 이동하십시오.

    map.input.file 환경 매개 변수에는 맵퍼가 처리중인 파일 이름이 있습니다. 매퍼에서이 값을 가져 와서 이것을 매퍼의 출력 키로 사용한 다음 단일 파일에서 모든 k / v를 하나의 감속기로 이동하십시오.

    매퍼의 코드입니다. BTW, 이전 MR API를 사용하고 있습니다.

    @Override
    public void configure(JobConf conf) {
        this.conf = conf;
    }
    
    @Override.
    public void map(................) throws IOException {
    
            String filename = conf.get("map.input.file");
            output.collect(new Text(filename), value);
    }
    

    MultipleOutputFormat을 사용하면 작업에 대한 여러 출력 파일을 쓸 수 있습니다. 파일 이름은 출력 키와 값에서 파생 될 수 있습니다.

  2. ==============================

    2.Hadoop은 데이터를 구성된 크기의 블록으로 '청크'합니다. 기본값은 64MB 블록입니다. 귀하의 접근 방식에서 이것이 어디에서 문제를 일으키는 지 알 수 있습니다. 각 매퍼는 파일 하나만 가져올 수 있습니다. 파일이 64MB (또는 구성된 모든 값) 미만이면 각 매퍼는 하나의 파일 만 가져옵니다.

    Hadoop은 데이터를 구성된 크기의 블록으로 '청크'합니다. 기본값은 64MB 블록입니다. 귀하의 접근 방식에서 이것이 어디에서 문제를 일으키는 지 알 수 있습니다. 각 매퍼는 파일 하나만 가져올 수 있습니다. 파일이 64MB (또는 구성된 모든 값) 미만이면 각 매퍼는 하나의 파일 만 가져옵니다.

    나는 매우 비슷한 제약 조건을 가지고있다. 단일 매퍼가 전적으로 처리하기 위해 일련의 파일 (체인의 이전 감속기의 출력)이 필요했습니다. 내 솔루션에서 <64MB 사실을 사용합니다. 내 솔루션의 주요 추진력은 처리해야하는 파일 이름을 매퍼에 제공하도록 설정하고 매퍼에 내부적으로 파일로드 / 읽기가 필요하다는 것입니다. 이렇게하면 단일 매퍼가 전체 파일을 처리 할 수 ​​있습니다. 파일을 분산 처리하지 않지만 "개별 파일을 분산시키지 마십시오"라는 제약 조건으로 작동합니다. :)

    내 MR이 개별 파일로 처리 할 파일의 파일 이름을 작성하는 프로세스를 시작했습니다. 그 파일들이 작성된 곳은 입력 디렉토리입니다. 각 파일이 64MB보다 작 으면 각 파일에 대해 단일 매퍼가 생성됩니다. 지도 프로세스는 정확히 한 번만 호출됩니다 (파일에 항목이 하나만 있으므로). 그런 다음 매퍼에 전달 된 값을 가져 와서 파일을 열고 필요한 매핑을 수행 할 수 있습니다. hadoop은 프로세스를 맵핑 / 축소하는 방법에 대해 영리 해지기 때문에 각 매퍼가 단일 감속기로 이동하도록 사용할 감속기의 수를 지정해야 할 수 있습니다. 이 설정은 mapred.reduce.tasks 구성을 통해 설정할 수 있습니다. job.setNumReduceTasks ( "mapred.reduce.tasks", [여기에 파일 수])를 통해이 작업을 수행합니다.

    내 프로세스에는이 특정 솔루션을 매력적으로 만들 수있는 몇 가지 추가 요구 사항 / 제한 사항이 있습니다. 그러나 1 : 1에서 1 : 1 로의 예를 위해; 나는 그것을했고, 기초는 위에서 뻗어있다.

    HTH

  3. from https://stackoverflow.com/questions/8886285/hadoop-mapreduce-one-output-file-for-each-input by cc-by-sa and MIT license