본문으로 바로가기
반응형

하둡에서 맵리듀스 코드 작성시 로그를 보고싶은 경우가 있습니다.

특히나 해당 케이스가 몇번 일어났는지 부분적으로 로그를 찍어보고 싶은 경우가 있는데, 이때는 println 이나 log4j등을 사용하지 않고 카운터를 사용하면 편리합니다.


카운터는 Mapper나 Reducer의 필요한 곳에 static 함수를 호출하여 카운팅을 합니다.


먼저 conter를 사용하기 위한 enum을 정의합니다.

enum class의 이름은 카운터 그룹의 이름, Field는 카운터의 이름이 됩니다.


enum class BasketBallCount {
    Point_3,
    Point_2,
    Ponint_1
}


예제로 농구 점수를 세기위한 카운터를 만들었습니다.

Mapper또는 Recuder를 구현할때 특정 점수를 카운팅 하기 위해 아래와 같은 코드를 원하는 곳에 삽입합니다.

import org.apache.hadoop.io.IntWritable
import org.apache.hadoop.io.LongWritable
import org.apache.hadoop.io.Text
import org.apache.hadoop.mapreduce.Mapper

class BasketBallMapper : Mapper(){
    override fun map(key: LongWritable, value: IntWritable, context: Context) {

        val point = value.get()
        when(point) {
            1-> context.getCounter(BasketBallCounter.Point_1).increment(1)
            2-> context.getCounter(BasketBallCounter.Point_2).increment(1)
            3-> context.getCounter(BasketBallCounter.Point_3).increment(1)
        }
        
        context.write(Text(), IntWritable(point))
    }
}


이렇게 원하는곳에 카운터를 증가시키면 실행시 해당 conter의 값을 로그로 찍어줍니다.

또한 관리자용 web 화면에서도 해당 카운터를 쉽게 확인할 수 있습니다.


반응형