我有一个使用AvroKeyOutput作为输出格式的Reducer。默认情况下,MapReduce会将我所有的密钥写入单个输出文件。我想为每个键值写入一个单独的输出文件。 Avro提供了AvroMultipleOutputs方法,但是示例很简单。 Apache AvroMultipleOutputs提供的内容显示了定义作业时如何预配置各种输出。示例显示:
工作:AvroMultipleOutputs.addNamedOutput(job, "avro1", AvroOutputFormat.class, schema);AvroMultipleOutputs.addNamedOutput(job, "avro2", AvroOutputFormat.class, null);
reducer :amos = new AvroMultipleOutputs(conf);amos.getCollector("avro1", reporter).collect(datum);amos.getCollector("avro2", "A", reporter).collect(datum);amos.getCollector("avro3", "B", reporter).collect(datum);
但是我不知道我需要多少个文件或它们的名字,因为它基于我的化简器中的键值。如何修改它以适应动态文件命名?

最佳答案

在这种情况下可以使用的策略:

  • 使用仅 map 作业(零归约任务)
  • 具有单个命名的多个输出配置
  • map()期间的
  • 使用您的键值作为AvroMultipleOutputs.write(String namedOutput, Object key, Object value, String baseOutputPath)中的基本输出路径
  • 09-11 06:34