MapReduce
MapReduce의 역사
MapReduce는 2004년 Google 사내에서 개발되었습니다. 당시 Google에 근무하던 Jeffery Dean과 Sanjay Ghemawat가 개발의 주역입니다(Dean & Ghemawat, 2004). 두 사람이 저술한 글 "MapReduce: 대형 클러스터의 데이터 처리 간소화(MapReduce: Simplified Data Processing on Large Clusters)"에서 언급했듯이 함수 프로그래밍에서 흔히 쓰이는 map과 reduce 함수에서 아이디어를 얻은 것이 기원입니다. 당시 Google의 독점 자산이던 MapReduce 시스템은 GFS(Google File System)에서 실행되었습니다. 2014년 무렵에는 Google에서 MapReduce를 자사의 기본 빅데이터 처리 모델로 사용하지 않게 되었습니다. MapReduce은 한때 HDFS에 보관된 데이터를 회수할 수 있는 유일한 방법이었지만, 이제는 그렇지도 않습니다. 지금은 Hive 및 Pig와 같이 SQL과 유사한 문을 사용하여 MapReduce 모델을 사용해 쓴 작업과 함께 실행해 HDFS에서 데이터를 가져오는 다른 쿼리 기반 시스템도 있습니다.
MapReduce는 어떻게 작용합니까?
MapReduce 시스템은 보통 세 가지 단계로 구성됩니다(Map과 Reduce 작업/함수를 조합한 것으로 일반화되어 있기는 하지만). MapReduce 작업은 다음과 같은 작업입니다.
- Map: 입력 데이터를 우선 여러 개의 작은 블록으로 분할합니다. 그런 다음 하둡 프레임워크가 처리할 데이터의 크기와 각 매퍼 서버에서 이용 가능한 메모리 블록에 따라 매퍼를 몇 개나 사용할지 결정합니다. 다음으로 각각의 블록을 매퍼에 할당하여 처리하도록 합니다. 각각의 "작업자" 노드가 map 함수를 로컬 데이터에 적용하고, 출력을 임시 스토리지에 씁니다. 기본(마스터) 노드가 있으므로 중복 입력 데이터의 사본 한 개만 처리되지 않도록 보장합니다.
- 셔플, 조합, 분할: 작업자 노드가 출력 키(map 함수가 도출)를 근거로 데이터를 다시 배포하여 한 키에 속하는 모든 데이터는 같은 작업자 노드에 위치하도록 합니다. 옵션 프로세스로 결합기(리듀서)가 각각의 매퍼 서버에서 따로 실행되어 각 매퍼의 데이터를 더 줄일 수도 있습니다. 이렇게 하면 데이터 풋프린트가 줄어들어 셔플과 정렬이 더 쉬워집니다. 분할(옵션 아님)은 데이터를 리듀서에 어떤 식으로 표시할지 결정하고, 데이터를 특정 리듀서에 할당하기도 하는 프로세스입니다.
- Reduce: 매퍼가 아직 진행 중인 동안에는 리듀서를 시작할 수 없습니다. 작업자 노드가 <key,value> 쌍 출력 데이터 그룹을 각각, 병렬로 처리하여 출력값으로 <key,value> 쌍을 도출합니다. 키가 같은 map 출력값은 모두 한 개의 리듀서에 할당되고, 이것이 그 키의 값을 집계합니다. 첫 데이터를 필수적으로 필터링하고 정렬해야 하는 map 함수와 달리 reduce 함수에서는 이 작업이 옵션입니다.
MapReduce를 사용할 때 고려해야 할 점은 어떤 것이 있습니까?
견고한 MapReduce 프로그래밍 패러다임
Map과 Reduce 인터페이스를 프로그래머에게 노출하여 Hadoop 내에 분산형 애플리케이션을 생성하는 작업이 간소화되었지만, MapReduce 프로그래밍 패러다임의 광범위한 로직을 표현하기는 어려운 일입니다. 반복 프로세스는 MapReduce와 잘 맞지 않는 로직의 대표적인 예입니다. 일반적으로 데이터를 메모리에 보관하지 않으며 반복 로직은 MapReduce 애플리케이션을 연쇄적으로 함께 연결하여 취급하므로 복잡성이 가중되는 결과를 초래하게 됩니다.