Monday
자바 MR Reducer Iterable values 메모리 재사용 이슈 본문
Java를 이용하여 MapReduce를 개발하다 보면 Reducer의 Iterable<T> values를 재사용하고 싶은 경우가 생깁니다.
이 때, 하둡은 성능, 적은 메모리 사용을 위하여 메모리는 재활용하여 1곳의 메모리 영역만 사용하고 values의 값들만 차례차례 변경하여 사용합니다.
public static class Reduce extends Reducer<Text,IntWritable,Text,IntWritable> {
public void reduce(Text key, Iterable<IntWritable> values,Context context)
throws IOException,InterruptedException {
int sum=0;
for(IntWritable x: values)
{
sum+=x.get();
}
context.write(key, new IntWritable(sum));
}
}
다음과 같이 메모리 공간은 재활용 한 채 값만 변경하여 사용합니다.
따라서, values를 재사용하고 싶어 List로 만드는 경우 새로운 객체를 생성해서 추가하는 방식으로 문제를 해결해야 합니다.
//방법 1
IntWritable first = WritableUtils.clone(values.next(), context.getConfiguration());
IntWritable second = WritableUtils.clone(values.next(), context.getConfiguration());
List<IntWritable> list = new ArrayList();
list.add(first);
list.add(second);
//방법 2
IntWritable temp = new IntWritable();
...(생략)
list.add(temp)
'빅데이터 > Hadoop' 카테고리의 다른 글
Wsl2 docker기반 하둡 클러스터 구축하기 (1) 스탠드얼론 (0) | 2021.10.24 |
---|
Comments