<aside>
💡 이번 강의에선 MapReduce를 실행했을 때, Hadoop Cluster에서는 어떤 식으로 동작하는지 알아본다.
</aside>
- Map : Dataset에서 Key-Value 쌍을 추출
- Shuffle & Sort : 각 Key와 연관된 Value를 Value list로 만들어서 담음 → MapReduce에서 알아서 해줌(직접 코드 작성할 필요 없음)
- Reduce : 이전까지 작업된 데이터를 토대로, 필요한 연산을 해서 최종 결과물을 생성
이 작업들은 여러 노드에서 병렬적으로 처리할 수 있음.
위의 그림에서 볼 수 있듯이, Mapping 작업 전에, 해당 데이터셋을 파티션 단위로 Splitting 하는 단계가 있다. 이렇게 쪼개진 데이터셋은 서로 독립적이므로 Mapping 작업은 다른 파티션의 데이터는 신경 쓰지 않아도 돼서 병렬화 하기에 수월하다. (서로 다른 노드에서 작업이 이루어질 수 있음) Splitting 하는 크기는 일반적으로 HDFS 블록의 기본 크기인 128MB가 적당하다고 한다. (ratio ????)
- HDFS 블록의 크기로 Splitting 하는 이유 : HDFS 블록의 크기가 단일 노드에 저장된다고 “확신"할 수 있는 가장 큰 입력 크기이기 때문이다. 하나의 스플릿이 두 블록에 걸쳐 있을 때, 두 블록 모두 저장하는 HDFS 노드는 존재하지 않을 가능성이 높기 때문에, 이렇게 되면 스플릿의 일부 데이터를 네트워크를 통해서 전송해야 하는 오버헤드가 발생한다. → 맵 태스크가 로컬 데이터만 이용할 때보다 더 느려짐.
이렇게 다른 노드에서 서로 다른 Mapping 작업이 발생하면, 여러 노드에서 같은 Key를 가진 Key-Value 쌍이 나타날 수 있다. 이걸 Key 하나에 Value 리스트로 만들어주는 작업이 Shuffle & Sort 단계이다. 이 작업은 MapReduce에서 알아서 해주니 크게 걱정하지 않아도 된다.
- 단일 Reduce Task 사용
- 결국 모든 Mapper의 Output을 입력으로 받기 때문에 Reduce Task가 실행중인 노드에 한 곳으로 모으게 되어, Locality 장점이 없음.
- 여러 개의 Reduce Task 사용
- Map Task은 Reduce의 수만큼 파티션을 생성해서 Map의 결과를 각 파티션에 분배한다. (Mapping과 Shuffling 사이에 Partitioning이 있다고 보면 됨)
- Reduce Task를 사용하지 않음
- 셔플이 필요 없고, 모든 처리 과정을 완전히 병렬로 처리하는 경우에 적합 (Airflow Dynamic Task Mapping 기능)
<aside>
❓ 그럼 Reduce Task의 개수만큼 결과의 개수도 정해지는 거라면, 일반적인 경우에 마지막 MapReduce 연산에선 Reduce를 하나만 사용할까?
</aside>
이후 여러 Set로 나눠진 Key-Value 리스트 데이터를 각각의 노드에서 병렬로 Reducing 처리를 한다. 이후 이 데이터를 모두 Aggregate 해서 최종 데이터를 클라이언트로 전달하게 된다.
MapReduce 작업을 Hadoop에서 실행하는 과정
Hadoop 초기 버전 (version 1)
JobTracker & TaskTracker
(https://phoenixnap.com/kb/hadoop-mapreduce)