気が向いたら(またはGoogleで実装を見つけることができます)、FSDataOutputStreamをZipOutputStreamでラップするFileOutputFormatを記述して、各レデューサーのZipファイルを提供できます(したがって、seqを記述する手間を省くことができます)。ファイル抽出プログラム。
独自のOutputFormatを作成することに躊躇しないでください。実際にはそれほど難しくありません(分割を心配する必要のあるカスタムInputFormatを作成するよりもはるかに簡単です)。実際、ここから出発点があります。writeメソッドを実装する必要があります。
// Key: Text (path of the file in the output zip)
// Value: BytesWritable - binary content of the image to save
public class ZipFileOutputFormat extends FileOutputFormat<Text, BytesWritable> {
@Override
public RecordWriter<Text, BytesWritable> getRecordWriter(
TaskAttemptContext job) throws IOException, InterruptedException {
Path file = getDefaultWorkFile(job, ".zip");
FileSystem fs = file.getFileSystem(job.getConfiguration());
return new ZipRecordWriter(fs.create(file, false));
}
public static class ZipRecordWriter extends
RecordWriter<Text, BytesWritable> {
protected ZipOutputStream zos;
public ZipRecordWriter(FSDataOutputStream os) {
zos = new ZipOutputStream(os);
}
@Override
public void write(Text key, BytesWritable value) throws IOException,
InterruptedException {
// TODO: create new ZipEntry & add to the ZipOutputStream (zos)
}
@Override
public void close(TaskAttemptContext context) throws IOException,
InterruptedException {
zos.close();
}
}
}