Как установить кодек сжатия AVRO для вывода картографа? - PullRequest
0 голосов
/ 23 декабря 2018

При использовании Avro в качестве выходного формата преобразователя в задаче hadoop MR, как я могу установить кодек сжатия?

Старый "mapred" API предоставил этот метод:

org.apache.avro.mapred.AvroJob.setOutputCodec(JobConf job, String codec)

Однако, это отсутствует в более новом API mapreduce .Как я могу установить кодек в более новом API "mapreduce"?

Я наивно пытался использовать настройку задания для установки кодека, но безуспешно:

public int run(String[] args) throws Exception {
  [..]
  Job job = new Job(getConf());
  job.setJarByClass(MapReduceExample.class);
  job.setJobName("MRExample");
  // hm .. this doesn't seem to do work, output still has "null" codec
  job.getConfiguration().set(AvroJob.CONF_OUTPUT_CODEC,
                             CodecFactory.deflateCodec(6).toString());

  job.setMapperClass(ExampleMapper.class);
  [..]
  AvroJob.setMapOutputKeySchema(job, Schema.create(Schema.Type.STRING));
  AvroJob.setMapOutputValueSchema(job, Schema.create(Schema.Type.BYTES));
  // here I was hoping to use something like
  // AvroJob.setMapOutputCodec(job, "deflate")

  [..]
  return (job.waitForCompletion(true) ? 0 : 1);
}

Когда яоткройте получившееся авро с помощью python

>>> from avro.datafile import DataFileReader
>>> from avro.io import DatumReader
>>> av_fh = open("output/part-r-00000.avro", "rb")
>>> av_rd = DataFileReader(av_fh, DatumReader())
>>> av_rd.codec
'null'

1 Ответ

0 голосов
/ 24 декабря 2018

Работает, когда я меняю следующие строки

job.getConfiguration().set(AvroJob.CONF_OUTPUT_CODEC,
                           CodecFactory.deflateCodec(6).toString());

на

FileOutputFormat.setCompressOutput(job, true);
job.getConfiguration().set(AvroJob.CONF_OUTPUT_CODEC,
                           DataFileConstants.DEFLATE_CODEC);
...