0

hdfs から画像を読み込もうとしています。imageinputformat と imageRecordReader の独自のカスタム実装を作成しました。

ImageRecordReader の nextkeyvalue method() --これが RecordReader API です。たとえば、画像を読み取るための for ループを指定する必要がありますか。入力フォーム HDFS を画像ディレクトリとして指定しているため、 for(Path path:paths) など。または、画像がさまざまなマップタスクに分割され、各マップが画像を取得するため、画像を単独で読み取ります。

私はここで少し混乱しています。メソッド initialize または nextkeyvalue() で for ループを使用する必要がありますか? はいの場合、initialize() メソッドまたは nextkeyvalue() のどこで使用する必要がありますか? (上記のリンク方法の詳細を確認してください)。

4

1 に答える 1

0

独自のフォーマットを実装する代わりにSequenceFilewithを書いてみませんか?<Text,BytesWritable>

パスを保存する必要があるいくつかのランダムな画像の例yourImagePaths:

// omitted try / catch and finally statements
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
Path output = new Path("/tmp/out.seq");

List<String> yourImagePaths = new LinkedList<>();
    // TODO fill your image paths here
SequenceFile.Writer writer = new SequenceFile.Writer(fs, conf, output,
    Text.class, BytesWritable.class);

for (String file : yourImagePaths) {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    org.apache.hadoop.io.IOUtils.copyBytes(fs.open(new Path(file)), out, conf);
    writer.append(new Text(file), new BytesWritable(out.toByteArray()));
}

writer.close();

基本的に、パスをキーとして(画像を識別するため)、画像からの生のバイトを値として書き込みます。

これで、Hadoop ジョブでそれを読み取ることができ、自動的に分割されます。Text入力キーは、値はBytesWritableであり、 を使用する必要があると言うだけですSequenceFileInputFormat

于 2012-06-06T10:16:53.553 に答える