Monday

자바 MR Reducer Iterable values 메모리 재사용 이슈 본문

빅데이터/Hadoop

자바 MR Reducer Iterable values 메모리 재사용 이슈

뉴비2 2021. 4. 21. 00:32

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)

 

Comments