我有一个任务,它在由输入记录的几个字段组织的多个目录中写入 avro 输出。
例如 : 各国历年的流程记录 并写入国家/年的目录结构 例如: 输出/usa/2015/outputs_usa_2015.avro 输出/uk/2014/outputs_uk_2014.avro
AvroMultipleOutputs multipleOutputs=new AvroMultipleOutputs(context);
....
....
multipleOutputs.write("output", avroKey, NullWritable.get(),
OUTPUT_DIR + "/" + record.getCountry() + "/" + record.getYear() + "/outputs_" +record.getCountry()+"_"+ record.getYear());
下面的代码将使用哪个输出提交者来编写输出。与推测执行一起使用是否不安全?通过推测执行,这会导致(可能会导致)org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException
在这篇文章 中 Hadoop Reducer:如何使用推测执行输出到多个目录? 建议使用自定义输出提交器
hadoop AvroMultipleOutputs 的以下代码没有说明推测执行有任何问题
private synchronized RecordWriter getRecordWriter(TaskAttemptContext taskContext,
String baseFileName) throws IOException, InterruptedException {
writer =
((OutputFormat) ReflectionUtils.newInstance(taskContext.getOutputFormatClass(),
taskContext.getConfiguration())).getRecordWriter(taskContext);
...
}
如果 baseoutput 路径位于作业目录之外,则 write 方法也不会记录任何问题
public void write(String namedOutput, Object key, Object value, String baseOutputPath)
在作业目录之外写入时,AvroMultipleOutputs(其他输出)是否存在具有推测执行的真正问题?如果,那么我如何覆盖 AvroMultipleOutputs 以拥有它自己的输出提交者。我在 AvroMultipleOutputs 中看不到它使用的输出提交者的任何输出格式