복붙노트

[HADOOP] 축소 단계 후에 출력 파일 병합

HADOOP

축소 단계 후에 출력 파일 병합

mapreduce에서 각 reduce 작업은 part-r-nnnnn이라는 파일에 출력을 씁니다. 여기서 nnnnn은 reduce 작업과 관련된 파티션 ID입니다. map / reduce는 이러한 파일을 병합합니까? 그렇다면 어떻게?

해결법

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

    1.직접 파일을 병합하는 대신, 다음을 호출하여 reduce 출력 파일의 전체 병합을 위임 할 수 있습니다.

    직접 파일을 병합하는 대신, 다음을 호출하여 reduce 출력 파일의 전체 병합을 위임 할 수 있습니다.

    hadoop fs -getmerge /output/dir/on/hdfs/ /desired/local/output/file.txt
    

    참고 이것은 HDFS 파일을 로컬로 결합합니다. 실행하기 전에 충분한 디스크 공간이 있는지 확인하십시오.

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

    2.아니요, 이러한 파일은 Hadoop에 병합되지 않습니다. 가져 오는 파일의 수는 축소 작업 수와 같습니다.

    아니요, 이러한 파일은 Hadoop에 병합되지 않습니다. 가져 오는 파일의 수는 축소 작업 수와 같습니다.

    다음 작업을위한 입력으로 필요하면 별도의 파일을 작성하는 것에 대해 걱정할 필요가 없습니다. 다음 작업의 입력으로 전체 디렉토리를 지정하기 만하면됩니다.

    클러스터 외부의 데이터가 필요한 경우 일반적으로 클러스터에서 데이터를 가져올 때받는 쪽에서 병합합니다.

    나. 이 같은:

    hadoop fs -cat /some/where/on/hdfs/job-output/part-r-* > TheCombinedResultOfTheJob.txt
    
  3. ==============================

    3.그것이 HDFS에서 파일을 병합하는 데 사용할 수있는 기능입니다.

    그것이 HDFS에서 파일을 병합하는 데 사용할 수있는 기능입니다.

    public boolean getMergeInHdfs(String src, String dest) throws IllegalArgumentException, IOException {
        FileSystem fs = FileSystem.get(config);
        Path srcPath = new Path(src);
        Path dstPath = new Path(dest);
    
        // Check if the path already exists
        if (!(fs.exists(srcPath))) {
            logger.info("Path " + src + " does not exists!");
            return false;
        }
    
        if (!(fs.exists(dstPath))) {
            logger.info("Path " + dest + " does not exists!");
            return false;
        }
        return FileUtil.copyMerge(fs, srcPath, fs, dstPath, false, config, null);
    }
    
  4. ==============================

    4.원본 파일과 HDFS를 원본과 대상으로 사용하려면 다음 명령을 사용하십시오.

    원본 파일과 HDFS를 원본과 대상으로 사용하려면 다음 명령을 사용하십시오.

    hadoop fs -cat / input_hdfs_dir / * | hadoop fs -put - / output_hdfs_file

    이렇게하면 input_hdfs_dir의 모든 파일을 연결하고 출력을 output_hdfs_file의 HDFS에 다시 기록합니다. 일시적인 파일은 생성되지 않고 UNIX pe를 사용하여 즉석에서 발생하지만 모든 데이터가 로컬 시스템으로 되돌아 와서 hdfs에 다시 업로드된다는 것을 명심하십시오.

    또한 Avro, ORC 등과 같은 텍스트가 아닌 파일에서는 작동하지 않습니다.

    이진 파일의 경우 다음과 같이 할 수 있습니다 (디렉토리에 하이브 테이블을 매핑 한 경우).

    덮어 쓰기 테이블 삽입 tbl select * from tbl

    구성에 따라 파일 이상을 생성 할 수도 있습니다. 단일 파일을 만들려면 mapreduce.job.reduces = 1을 사용하여 reducers 수를 명시 적으로 1로 설정하거나 hive.merge.mapredfiles = true로 설정하십시오.

  5. ==============================

    5.part-r-nnnnn 파일은 'r'으로 지정된 축소 단계 이후에 생성됩니다. 이제 사실 하나의 감속기가 작동하면 part-r-00000과 같은 출력 파일이 생깁니다. 감속기의 수가 2이면 part-r-00000과 part-r-00001이 될 것입니다. hadoop 프레임 워크가 Commodity Machines에서 실행되도록 설계 되었기 때문에 출력 파일이 너무 커서 기계 메모리에 맞지 않으면 파일이 분리됩니다. MRv1에 따라 로직에서 작동하는 리듀서의 수는 20 개로 제한됩니다. mapred-site.xml 구성 파일에서 사용자 정의 할 필요는 더 많지만 같을 수 있습니다. 당신의 질문에 대해 말하기; 당신은 getmerge를 사용하거나 드라이버 코드에 다음 명령문을 삽입하여 reducers 수를 1로 설정할 수 있습니다

    part-r-nnnnn 파일은 'r'으로 지정된 축소 단계 이후에 생성됩니다. 이제 사실 하나의 감속기가 작동하면 part-r-00000과 같은 출력 파일이 생깁니다. 감속기의 수가 2이면 part-r-00000과 part-r-00001이 될 것입니다. hadoop 프레임 워크가 Commodity Machines에서 실행되도록 설계 되었기 때문에 출력 파일이 너무 커서 기계 메모리에 맞지 않으면 파일이 분리됩니다. MRv1에 따라 로직에서 작동하는 리듀서의 수는 20 개로 제한됩니다. mapred-site.xml 구성 파일에서 사용자 정의 할 필요는 더 많지만 같을 수 있습니다. 당신의 질문에 대해 말하기; 당신은 getmerge를 사용하거나 드라이버 코드에 다음 명령문을 삽입하여 reducers 수를 1로 설정할 수 있습니다

    job.setNumReduceTasks(1);
    

    희망이 귀하의 질문에 대한 답변.

  6. ==============================

    6.map / reduce 태스크가 데이터를 변경하지 않는 map / reduce 태스크를 추가로 실행할 수 있으며, 파티셔너는 모든 데이터를 단일 감속기에 할당합니다.

    map / reduce 태스크가 데이터를 변경하지 않는 map / reduce 태스크를 추가로 실행할 수 있으며, 파티셔너는 모든 데이터를 단일 감속기에 할당합니다.

  7. ==============================

    7.이전의 대답 외에도 몇 분 전에 시도했던 답변이 하나 더 있습니다. 아래 코드와 같은 CustomOutputFormat을 사용할 수 있습니다.

    이전의 대답 외에도 몇 분 전에 시도했던 답변이 하나 더 있습니다. 아래 코드와 같은 CustomOutputFormat을 사용할 수 있습니다.

    public class VictorOutputFormat extends FileOutputFormat<StudentKey,PassValue> {
    
        @Override
        public RecordWriter<StudentKey,PassValue> getRecordWriter(
                TaskAttemptContext tac) throws IOException, InterruptedException {
            //step 1: GET THE CURRENT PATH
            Path currPath=FileOutputFormat.getOutputPath(tac);
    
            //Create the full path
            Path fullPath=new Path(currPath,"Aniruddha.txt");
    
            //create the file in the file system
            FileSystem fs=currPath.getFileSystem(tac.getConfiguration());
            FSDataOutputStream fileOut=fs.create(fullPath,tac);
            return new VictorRecordWriter(fileOut);
        }
    
    }
    

    마지막으로 네 번째 라인을 살펴보십시오. 출력 파일 이름에 내 이름을 사용했으며 15 개의 감속기로 프로그램을 테스트했습니다. 여전히 파일은 동일하게 유지됩니다. 따라서 출력 파일의 크기가 기본 메모리의 크기를 초과해서는 안되며, 즉 출력 파일이 상품 기계의 메모리에 적합해야합니다. 출력 파일 분리 문제. 감사!!

  8. ==============================

    8.파티션 파일을 병합하는 데 이와 같은 돼지 스크립트를 사용하지 않는 이유는 무엇입니까?

    파티션 파일을 병합하는 데 이와 같은 돼지 스크립트를 사용하지 않는 이유는 무엇입니까?

    stuff = load "/path/to/dir/*"
    
    store stuff into "/path/to/mergedir"
    
  9. ==============================

    9.파일에 헤더가 있으면 다음을 수행하여 제거 할 수 있습니다.

    파일에 헤더가 있으면 다음을 수행하여 제거 할 수 있습니다.

    hadoop fs -cat /path/to/hdfs/job-output/part-* | grep -v "header" > output.csv
    

    그런 다음 output.csv에 대한 헤더를 수동으로 추가하십시오

  10. ==============================

    10.아닙니다. 병합되지 않습니다.

    아닙니다. 병합되지 않습니다.

    IdentityReducer를 사용하여 목표를 달성 할 수 있습니다.

    public void reduce(K key,
                       Iterator<V> values,
                       OutputCollector<K,V> output,
                       Reporter reporter)
                throws IOException
    

    관련 SE 게시물을 살펴보십시오.

    hadoop : 0 감속기와 신원 감속기의 차이점은 무엇입니까?

  11. from https://stackoverflow.com/questions/5700068/merge-output-files-after-reduce-phase by cc-by-sa and MIT license