test.txt 에 아래와 같은 데이터가 있다면
1,2,1,2 B,A,B,A 3,3,2,3 A,B,B,B |
$ hadoop fs -put test.txt /user/test.txt
를 통해 hdpf 에 저장되어 있다 가정하자
이때 아래와 같이 2개의 datanode 로 데이터가 분산되어 있다면
datanode 1의 데이터는
datanode 2의 데이터는
이렇게 분산되어 있다라고 가정하자.
이 데이터의 최빈도(가장 많은 단어 mode)를 획득하려고 한다. 그래서 아래와 같이 구현했다고 가정하자
mapper 에서는 각 데이터를 분할하고
reduce 에서는 각 데이터의 최종합을 구하도록 mapreduce
mapper 의 input 은 해당 데이터의 line 별로 입력된다.
보통 입력된 데이터를 필요한 포맷으로 split 하여 사용한다. 여기서는 , 로 split 한다.
즉 datanode 1 의 mapper 에서는
1) 1,2,1,2
2) B,A,B,A
이러한 데이터로 두번 mapper 의 map 메소드가 호출되고
즉 datanode 2 역시
1) 3,3,2,3
2) A,B,B,B
이러한 데이터로 두번 mapper 의 map 메소드가 호출된다.
이동작을 표로 구분하면 다음과 같다.
1. combiner 가 없는 경우
동작 | 데이터노드1 | 데이터노드 2 |
HDFS 데이터 | 1,2,1,2 B,A,B,A | 3,3,2,3 A,B,B,B |
Mapper 의 map 메소드 입력 | 1,2,1,2 | 3,3,2,3 |
B,A,B,A | A,B,B,B |
Mapper 의 map 메소드 출력 | (1, NullWritable) | (3, NullWritable) |
(2, NullWritable) | (3, NullWritable) |
(1, NullWritable) | (2, NullWritable) |
(2, NullWritable) | (3, NullWritable) |
(B, NullWritable) | (A, NullWritable) |
(A, NullWritable) | (B, NullWritable) |
(B, NullWritable) | (B, NullWritable) |
(A, NullWritable) | (B, NullWritable) |
Shuffle(key 로 sorting) |
Reducer 의 reduce 메소드의 입력 * NullWritable => N 으로 기술 | (1, [N,N]) |
(2, [N,N,N]) |
(3, [N,N,N]) |
(A, [N,N,N]) |
(B, [N,N,N,N,N]) |
Reducer 의 reduce 메소드의 출력(최빈도) | (B, 5) |
2. combiner 를 구현한 경우
combiner 에서는 value 를 각 단어의 개수를 저장함
동작 | 데이터노드1 | 데이터노드 2 |
HDFS 데이터 | 1,2,1,2 B,A,B,A | 3,3,2,3 A,B,B,B |
Mapper 의 map 메소드 입력 | 1,2,1,2 | 3,3,2,3 |
B,A,B,A | A,B,B,B |
Mapper 의 map 메소드 출력 | (1, NullWritable) | (3, NullWritable) |
(2, NullWritable) | (3, NullWritable) |
(1, NullWritable) | (2, NullWritable) |
(2, NullWritable) | (3, NullWritable) |
(B, NullWritable) | (A, NullWritable) |
(A, NullWritable) | (B, NullWritable) |
(B, NullWritable) | (B, NullWritable) |
(A, NullWritable) | (B, NullWritable) |
Combiner 의 reduce 메소드의 입력 * NullWritable => N 으로 기술 | (1, [N,N]) | (2, [N]) |
(2, [N,N]) | (3, [N,N,N]) |
(A, [N,N]) | (A, [N]) |
(B, [N,N]) | (B, [N,N,N]) |
Combiner 의 reduce 메소드의 출력 | (1, 2) | (2, 1) |
(2, 2) | (3, 3) |
(A, 2) | (A, 1) |
(B, 2) | (B, 3) |
Shuffle(key 로 sorting) |
Reducer 의 reduce 메소드의 입력 | (1, [2]) |
(2, [2, 1]) |
(3, [3]) |
(4, [1]) |
(A, [2, 1]) |
(B, [2, 3]) |
Reducer 의 reduce 메소드의 출력 (최빈도) | (B, 5) |