私はhadoopで次のことを試みています:
- ファイルをディレクトリ "foo" に出力する map-reduce ジョブを実装しました。
- foo ファイルは、key=IntWriteable、value=IntWriteable 形式です (SequenceFileOutputFormat を使用)。
- ここで、別の map-reduce ジョブを開始したいと思います。マッパーは問題ありませんが、各レデューサーは起動時に "foo" ファイル全体を読み取る必要があります (レデューサー間でデータを共有するために HDFS を使用しています)。
「public void configure(JobConf conf)」でこのコードを使用しました。
String uri = "out/foo";
FileSystem fs = FileSystem.get(URI.create(uri), conf);
FileStatus[] status = fs.listStatus(new Path(uri));
for (int i=0; i<status.length; ++i) {
Path currFile = status[i].getPath();
System.out.println("status: " + i + " " + currFile.toString());
try {
SequenceFile.Reader reader = null;
reader = new SequenceFile.Reader(fs, currFile, conf);
IntWritable key = (IntWritable) ReflectionUtils.newInstance(reader.getKeyClass(), conf);
IntWritable value = (IntWritable ) ReflectionUtils.newInstance(reader.getValueClass(), conf);
while (reader.next(key, value)) {
// do the code for all the pairs.
}
}
}
コードは 1 台のマシンで問題なく動作しますが、クラスターで実行できるかどうかはわかりません。つまり、このコードは現在のマシンからファイルを読み取るのか、それとも分散システムから id を読み取るのか?
私がやろうとしていることに対するより良い解決策はありますか?
前もって感謝します、
アリク。