2

Hadoopジョブで多くの画像を処理および操作する必要があります。入力はネットワーク経由で行われ、を使用してダウンロードが遅くなりますMultiThreadedMapper

しかし、出力を減らすための最良のアプローチは何ですか?生のバイナリ画像データをシーケンスファイルに書き込み、それらのファイルを最終的なホームに転送してから、小さなアプリを作成して、から個々の画像SequenceFileを個々のJPGおよびGIFに抽出する必要があると思います。

それとも、検討すべきより良いオプションがありますか?

4

1 に答える 1

3

気が向いたら(または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();
        }
    }
}
于 2013-01-10T12:32:09.860 に答える