당신의 문제는 reduce() 파일을 읽는 것에 있다고 생각합니다. configure() (이전 API 사용) 또는 setup() (새 API 사용)의 파일을 읽어야합니다. 따라서 모든 감속기에 대해 감속기에 대한 각 입력 그룹에 대해 읽기보다는 한 번만 읽습니다 (기본적으로 메소드를 줄이기위한 각 호출).
다음과 같이 작성할 수 있습니다. NEW mapreduce API .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 {
...
}
}
는 OLD는 API (org.apache.hadoop.mapred를 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 {
...
}
}