기본 카운터의 구현은 이전 포스트에서 다른적이 있다.
hadoop 에서는 이미 counter 를 많이 사용하고 있다.
hadoop 에 jar를 올려 실행하면 실행결과 최종에 나오는 값들이 모두 카운터를 통해 구현된 값이다.
해당 jar 실행시 아래와 같은 최종 결과가 나온다
counter 는 총 43개 이며 해당 카운터에 mapreduce 프로그램이 동작할 사용한 주요 값들을 확인할 수 있다.
대표적으로 map, combine, reduce 에 input 된 record 수와 output된 record 수를 확인 할 수 있있으며, 실행시간 shuffle 된 byte 수도 확인이 가능한다.
이것을 통해 튜닝포인트를 잡을 수가 있게 된다.
기본 실행 결과 예시> combiner 를 구현하지 않은 경우
INFO mapreduce.Job: Counters: 43
File System Counters
FILE: Number of bytes read=37834707
FILE: Number of bytes written=76663746
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=1397535171
HDFS: Number of bytes written=21
HDFS: Number of read operations=36
HDFS: Number of large read operations=0
HDFS: Number of write operations=2
Job Counters
Launched map tasks=11
Launched reduce tasks=1
Data-local map tasks=11
Total time spent by all maps in occupied slots (ms)=88360
Total time spent by all reduces in occupied slots (ms)=11532
Map-Reduce Framework
Map input records=2007594
Map output records=2007593
Map output bytes=33819515
Map output materialized bytes=37834767
Input split bytes=1474
Combine input records=0
Combine output records=0
Reduce input groups=4
Reduce shuffle bytes=37834767
Reduce input records=2007593
Reduce output records=1
Spilled Records=4015186
Shuffled Maps =11
Failed Shuffles=0
Merged Map outputs=11
GC time elapsed (ms)=1029
CPU time spent (ms)=26570
Physical memory (bytes) snapshot=10722308096
Virtual memory (bytes) snapshot=23048646656
Total committed heap usage (bytes)=12089032704
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=1397533697
File Output Format Counters
Bytes Written=21
위의 결과를 보면 combiner 가 구현되지 않았기 때문에 combine input records 와 output records 가 0 이며,
reduce 에서 shuffle 된 bytes 와 records 수가 매우 높은 것을 알 수 있다.
그에 따라 reduce 에서 해당 값을 처리하기 위해 11532 ms 를 소모했다.
아래 결과는 combiner 를 구현한 경우이다.
INFO mapreduce.Job: Counters: 43
File System Counters
FILE: Number of bytes read=908
FILE: Number of bytes written=998468
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=1397535171
HDFS: Number of bytes written=21
HDFS: Number of read operations=36
HDFS: Number of large read operations=0
HDFS: Number of write operations=2
Job Counters
Launched map tasks=11
Launched reduce tasks=1
Data-local map tasks=11
Total time spent by all maps in occupied slots (ms)=86586
Total time spent by all reduces in occupied slots (ms)=5220
Map-Reduce Framework
Map input records=2007594
Map output records=2007593
Map output bytes=33819515
Map output materialized bytes=968
Input split bytes=1474
Combine input records=2007593
Combine output records=44
Reduce input groups=4
Reduce shuffle bytes=968
Reduce input records=44
Reduce output records=1
Spilled Records=88
Shuffled Maps =11
Failed Shuffles=0
Merged Map outputs=11
GC time elapsed (ms)=1057
CPU time spent (ms)=24930
Physical memory (bytes) snapshot=10712588288
Virtual memory (bytes) snapshot=23029968896
Total committed heap usage (bytes)=12059148288
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=1397533697
File Output Format Counters
Bytes Written=21
첫번째의 결과와 다른 것은 combiner (각 datanode 에서 동작하여 분산처리됨)의 구현을 통해 reduce 에서 취합되는 데이터의 양을 최소화 시켰다. 즉 combine output 은 44 records 로 줄였으며, 그로 인해 reduce 의 input shuffle 등의 값이 현저하게 주는 것을 확인할 수 있다.
결과를 보면 maps 의 소모시간은 조금 증가하였지만, reduce 의 소모시간은 반으로 준 것을 확인할 수 있다.
이와 같이 counter 는 개발자의 데이터 공유뿐만 아니라 mapreduce 동작의 기본값을 확인 할 수 있기 때문에 활용도가 매우 높다.
이런 기본 counter 값도 reduce 동작중 획득하여 사용할 수 있다.