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가 된다.

+ Recent posts