あなたの問題は、reduce() でファイルを読み取ることにあると思います。configure() (古い API を使用) または setup() (新しい API を使用) でファイルを読み取る必要があります。したがって、すべてのレデューサーに対して、レデューサーへの入力グループごとに読み取るのではなく、1 回だけ読み取られます (基本的には、reduce メソッドの呼び出しごと)。
次のようなものを書くことができます: 新しい mapreduce API (org.apache.hadoop.mapreduce.*) を使用する -
public static class ReduceJob extends Reducer<Text, Text, Text, Text> {
...
Path file1;
Path file2;
...
@Override
protected void setup(Context context) throws IOException, InterruptedException {
// Get the file from distributed cached
file1 = DistributedCache.getLocalCacheFiles(context.getConfiguration())[0];
file2 = DistributedCache.getLocalCacheFiles(context.getConfiguration())[1];
// parse the file and get it's data in-memory for use in reduce method, probably in some ArrayList or HashMap.
}
@Override
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException,
InterruptedException {
...
}
}
古い mapred API (org.apache.hadoop.mapred.*) を使用する -
public static class ReduceJob extends MapReduceBase implements Reducer<Text, Text, Text, Text> {
...
Path file1;
Path file2;
...
@Override
public void configure(JobConf job) {
// Get the file from distributed cached
file1 = DistributedCache.getLocalCacheFiles(job)[0]
file2 = DistributedCache.getLocalCacheFiles(job)[1]
...
// parse the file and get it's data in-memory for use in reduce method, probably in some ArrayList or HashMap.
}
@Override
public synchronized void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output,
Reporter reporter) throws IOException {
...
}
}