복붙노트

[HADOOP] 하둡 : 같은 작업에서 다른 형식을 출력하는 방법?

HADOOP

하둡 : 같은 작업에서 다른 형식을 출력하는 방법?

한 작업에서 gzip 및 lzo 형식을 동시에 출력하고 싶습니다.

MultipleOutputs를 사용하고 다음과 같이 두 개의 명명 된 출력을 추가합니다.

MultipleOutputs.addNamedOutput (작업, "LzoOutput", GBKTextOutputFormat.class, Text.class, Text.class);

GBKTextOutputFormat.setOutputCompressorClass (작업, LzoCodec.class);

MultipleOutputs.addNamedOutput (작업, "GzOutput", TextOutputFormat.class, Text.class, Text.class);

TextOutputFormat.setOutputCompressorClass (작업, GzipCodec.class);

(GBKTextOutputFormat은 FileOutputFormat을 확장하는 자체 작성)

그들은 다음과 같은 감속기에서 사용됩니다 :

multipleOutputs.write ( "LzoOutput", NullWritable.get (), 값, "/ user / hadoop / lzo /"+ key.toString ());

multipleOutputs.write ( "GzOutput", NullWritable.get (), 값, "/ user / hadoop / gzip /"+ key.toString ());

결과는 다음과 같습니다.

두 경로로 출력을 얻을 수 있지만 둘 다 gzip 형식입니다.

누군가 나를 도울 수 있습니까? 감사!

==========================================================================

더:

방금 FileOutputFormat에서 setOutputCompressorClass의 소스 코드를 살펴 보았습니다. 여기서 conf.setClass ( "mapred.output.compression.codec", codecClass, CompressionCodec.class);

setOutputCompressorClass가 호출되면 구성의 mapred.output.compression.codec가 재설정되는 것으로 보입니다.

따라서 실제 압축 형식은 마지막에 설정 한 형식이므로 동일한 작업에서 서로 다른 두 가지 압축 형식을 설정할 수 없습니까? 아니면 다른 것이 무시됩니까?

해결법

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

    1.따라서 해결 방법으로 구성에서 직접 올바른 outputCompressorClass를 설정하십시오.

    따라서 해결 방법으로 구성에서 직접 올바른 outputCompressorClass를 설정하십시오.

    context.getConfiguration().setOutputCompressorClass(GzipCodec.class);
    

    각 출력에 대한 쓰기 호출 직전에. 키 클래스, 값 클래스 및 출력 경로 이외의 출력 형식 구성 매개 변수가 MultipleOutputs에서 제대로 처리되지 않는 것처럼 보이므로 감독을 상쇄하기 위해 약간의 코드를 작성해야 할 수도 있습니다.

  2. from https://stackoverflow.com/questions/12953010/hadoop-how-to-output-different-format-types-in-the-same-job by cc-by-sa and MIT license