mapper 는 기본적으로 자신의 데이터노드에서 동작하기 때문에 여러 데이터노드의 경우 서로의 값의 공유할 수가 없다.
그에 때문에 hadoop 에서는 counter 를 통해 서로의 정보를 업데이트하여 reducer 에게 전달할 수 있다.
(단 long에 대한 증가/감소만 가능)
카운터의 등록은 enum 으로 등록하여야 하며, 필요한 enum 을 개발자는 생성해야 한다.
아래와 같은 enum 을 생성했다며
public static enum MATCH_COUNTER { TOTAL_COUNT };
mapper 에서는 아래와 같은 로직을 통해 특정 값을 증가 시킬 수 있다. @Override public void map(Object key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); context.getCounter(MATCH_COUNTER.TOTAL_COUNT).increment(1); // counter 증가 } } |
이렇게 증가된 값은 아래와 같이 사용할 수 있다.
public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "word count"); .... 중략 job.waitForCompletion(true) long totalCnt = job.getCounters().findCounter(MATCH_COUNTER.TOTAL_COUNT)).getValue(); ... 중략 } |
namenode 1 : outdata { "a","b","c"} 3개
namenode 2 : outdata { "d,"f"} 2개
counter 의 값은 5가 된다.
'IT > 빅데이터(bigData)' 카테고리의 다른 글
여러 기능의 맵리듀스를 하나의 jar 로 묶을때 (0) | 2014.11.22 |
---|---|
Hadoop 의 Counter 이야기 (0) | 2014.11.22 |
Reduce 에서 counter 조회 (0) | 2014.11.22 |
하이브(hive)에 대한 외부접속 (0) | 2014.11.21 |
MapReduce 프로그래밍 (0) | 2014.11.21 |