복붙노트

[HADOOP] Hadoop : HDFS에서 파일을 압축 하시겠습니까?

HADOOP

Hadoop : HDFS에서 파일을 압축 하시겠습니까?

최근 Hadoop에서 LZO 압축을 설정했습니다. HDFS에서 파일을 압축하는 가장 쉬운 방법은 무엇입니까? 파일을 압축 한 다음 원본을 삭제하고 싶습니다. IdentityMapper와 LZO 압축을 사용하는 IdentityReducer로 MR 작업을 생성해야합니까?

해결법

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

    1.필자가 말한 것처럼 Identity 매퍼를 사용하는 MapReduce 작업을 작성하는 것이 좋습니다. 그 동안 데이터를 시퀀스 파일에 기록하여 성능 로딩을 개선하는 것이 좋습니다. 시퀀스 파일을 블록 레벨 및 레코드 레벨 압축으로 저장할 수도 있습니다. Yo는 두 가지 유형의 레코드에 모두 최적화되어 있으므로 어떤 것이 가장 잘 작동하는지 확인해야합니다.

    필자가 말한 것처럼 Identity 매퍼를 사용하는 MapReduce 작업을 작성하는 것이 좋습니다. 그 동안 데이터를 시퀀스 파일에 기록하여 성능 로딩을 개선하는 것이 좋습니다. 시퀀스 파일을 블록 레벨 및 레코드 레벨 압축으로 저장할 수도 있습니다. Yo는 두 가지 유형의 레코드에 모두 최적화되어 있으므로 어떤 것이 가장 잘 작동하는지 확인해야합니다.

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

    2.필자는 파일을 압축하기 위해 Hadoop Streaming 작업을 작성하는 것이 오버 헤드가 적습니다.

    필자는 파일을 압축하기 위해 Hadoop Streaming 작업을 작성하는 것이 오버 헤드가 적습니다.

    이것은 내가 실행하는 명령입니다.

    hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-streaming-0.20.2-cdh3u2.jar \
      -Dmapred.output.compress=true \
      -Dmapred.compress.map.output=true \
      -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
      -Dmapred.reduce.tasks=0 \
      -input <input-path> \
      -output $OUTPUT \
      -mapper "cut -f 2"
    

    또한 일반적으로 무언가가 잘못 될 경우 임시 폴더에 출력을 숨길 것입니다.

    OUTPUT=/tmp/hdfs-gzip-`basename $1`-$RANDOM
    

    한 가지 더 말하지만 스트리밍 작업에 감속기를 지정하지는 않지만 확실히 할 수 있습니다. 그것은 큰 파일로 오랜 시간이 걸릴 수있는 모든 라인을 강제로 정렬합니다. 분할자를 재정 의하여이 문제를 해결할 수있는 방법이있을 수 있지만 그 사실을 파악하는 것을 괴롭히지 않았습니다. 불행한 점은 잠재적으로 HDFS 블록을 효율적으로 사용하지 않는 많은 작은 파일로 끝날 가능성이 있다는 것입니다. 하둡 아카이브를 살펴 보는 이유 중 하나입니다.

  3. ==============================

    3.Jeff Wu의 스트리밍 명령과 압축 된 파일의 연결은 압축 된 단일 파일을 제공합니다. 비 자바 매퍼가 스트리밍 작업에 전달되고 입력 형식이 텍스트 스트리밍 인 경우 값이 아닌 키만 출력됩니다.

    Jeff Wu의 스트리밍 명령과 압축 된 파일의 연결은 압축 된 단일 파일을 제공합니다. 비 자바 매퍼가 스트리밍 작업에 전달되고 입력 형식이 텍스트 스트리밍 인 경우 값이 아닌 키만 출력됩니다.

    hadoop jar contrib/streaming/hadoop-streaming-1.0.3.jar \
                -Dmapred.reduce.tasks=0 \
                -Dmapred.output.compress=true \
                -Dmapred.compress.map.output=true \
                -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
                -input filename \
                -output /filename \
                -mapper /bin/cat \
                -inputformat org.apache.hadoop.mapred.TextInputFormat \
                -outputformat org.apache.hadoop.mapred.TextOutputFormat
    hadoop fs -cat /path/part* | hadoop fs -put - /path/compressed.gz
    
  4. ==============================

    4.이것이 제가 사용했던 것입니다 :

    이것이 제가 사용했던 것입니다 :

    /*
     * Pig script to compress a directory
     * input:   hdfs input directory to compress
     *          hdfs output directory
     * 
     * 
     */
    
    set output.compression.enabled true;
    set output.compression.codec org.apache.hadoop.io.compress.BZip2Codec;
    
    --comma seperated list of hdfs directories to compress
    input0 = LOAD '$IN_DIR' USING PigStorage();
    
    --single output directory
    STORE input0 INTO '$OUT_DIR' USING PigStorage(); 
    

    LZO가 아니기 때문에 약간 느릴 수 있습니다.

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

    5.@Chra 평판 문제로 인해 논평 할 수 없습니다.

    @Chra 평판 문제로 인해 논평 할 수 없습니다.

    다음은 한 명령의 모든 것입니다. 두 번째 명령을 사용하는 대신 하나의 압축 파일로 직접 줄일 수 있습니다

    hadoop jar share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar \
            -Dmapred.reduce.tasks=1 \
            -Dmapred.output.compress=true \
            -Dmapred.compress.map.output=true \
            -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec \
            -input /input/raw_file \
            -output /archives/ \
            -mapper /bin/cat \
            -reducer /bin/cat \
            -inputformat org.apache.hadoop.mapred.TextInputFormat \
            -outputformat org.apache.hadoop.mapred.TextOutputFormat
    

    따라서 하나의 압축 파일 만 있으면 많은 공간을 확보 할 수 있습니다.

    예를 들어, 내가 10MB의 4 파일을 가지고 있다고 가정 해 봅니다 (일반 텍스트, JSON 형식)

    지도 만 650KB의 4 파일을 제공합니다. 매핑하고 줄이면 1.05 MB의 파일이 하나 있습니다.

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

    6.나는 이것이 오래된 쓰레드라는 것을 알고 있지만이 쓰레드를 따르는 사람 (나 같은)이 다음의 2 가지 메소드 중 하나가 각 행의 끝에 탭 (\ t) 문자를 준다는 것을 아는 것이 유용 할 것이다.

    나는 이것이 오래된 쓰레드라는 것을 알고 있지만이 쓰레드를 따르는 사람 (나 같은)이 다음의 2 가지 메소드 중 하나가 각 행의 끝에 탭 (\ t) 문자를 준다는 것을 아는 것이 유용 할 것이다.

     hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-streaming-0.20.2-cdh3u2.jar \
          -Dmapred.output.compress=true \
          -Dmapred.compress.map.output=true \
          -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
          -Dmapred.reduce.tasks=0 \
          -input <input-path> \
          -output $OUTPUT \
          -mapper "cut -f 2"
    
    
    hadoop jar share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar \
            -Dmapred.reduce.tasks=1 \
            -Dmapred.output.compress=true \
            -Dmapred.compress.map.output=true \
            -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec \
            -input /input/raw_file \
            -output /archives/ \
            -mapper /bin/cat \
            -reducer /bin/cat \
            -inputformat org.apache.hadoop.mapred.TextInputFormat \
            -outputformat org.apache.hadoop.mapred.TextOutputFormat
    

    이 hadoop-streaming.jar에서 각 줄의 끝에 x'09를 추가하고 수정 사항을 찾았으며 다음 두 매개 변수를 사용하여 구분 기호를 다시 지정해야합니다 (내 경우에는 그렇습니다).

     -Dstream.map.output.field.separator=, \
     -Dmapred.textoutputformat.separator=, \
    

    실행할 전체 명령

    hadoop jar <HADOOP_HOME>/jars/hadoop-streaming-2.6.0-cdh5.4.11.jar \
            -Dmapred.reduce.tasks=1 \
            -Dmapred.output.compress=true \
            -Dmapred.compress.map.output=true \
     -Dstream.map.output.field.separator=, \
     -Dmapred.textoutputformat.separator=, \
            -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.Lz4Codec \
            -input file:////home/admin.kopparapu/accenture/File1_PII_Phone_part3.csv \
            -output file:///home/admin.kopparapu/accenture/part3 \
     -mapper /bin/cat \
            -reducer /bin/cat \
            -inputformat org.apache.hadoop.mapred.TextInputFormat \
            -outputformat org.apache.hadoop.mapred.TextOutputFormat
    
  7. ==============================

    7.단일 파일을 압축하면 공간을 절약 할 수 있지만 압축 해제는 단일 Map 작업으로 순차적으로 수행해야하므로 Hadoop의 기능을 사용하여 파일을 처리 할 수는 없습니다. 파일이 많다면 Hadoop Archive가 있지만 어떤 종류의 압축도 포함되어 있는지 잘 모르겠습니다. 내가 생각할 수있는 압축의 주요 사용 사례는 Reduces (네트워크 I / O에 저장)로 보내지는 Maps의 출력을 압축하는 것입니다.

    단일 파일을 압축하면 공간을 절약 할 수 있지만 압축 해제는 단일 Map 작업으로 순차적으로 수행해야하므로 Hadoop의 기능을 사용하여 파일을 처리 할 수는 없습니다. 파일이 많다면 Hadoop Archive가 있지만 어떤 종류의 압축도 포함되어 있는지 잘 모르겠습니다. 내가 생각할 수있는 압축의 주요 사용 사례는 Reduces (네트워크 I / O에 저장)로 보내지는 Maps의 출력을 압축하는 것입니다.

    아, 귀하의 질문에 더 답변을, 당신은 아마 하나의지도 작업에 의해 전체 파일을 읽었는지 확인하기 위해 자신의 RecordReader 및 / 또는 InputFormat을 구현해야하며, 또한 올바른 압축 해제 필터를 사용했습니다.

  8. from https://stackoverflow.com/questions/7153087/hadoop-compress-file-in-hdfs by cc-by-sa and MIT license