일괄 처리
- 10.1 유닉스 도구로 일괄 처리하기
- 10.2 맵리듀스와 분산 파일 시스템
- 10.3 맵리듀스를 넘어서
맵리듀스는 결국 유닉스 철학을 수천 대의 머신으로 확장한 것이야. 입력은 불변, 출력은 새로 생성, 파이프라인으로 조합 — 이 원칙이 단일 머신에서도, 분산 시스템에서도 동일하게 강력하거든.
유닉스에서 awk | sort | uniq | head로 수 GB 로그를 몇 초 만에 처리할 수 있는 건, 각 프로그램이 한 가지 일을 잘 하고, 균일한 인터페이스(파일 = 바이트열 스트림)로 연결되기 때문이야. 이 조합 가능성이 핵심이지. 그리고 입력을 안 건드리고 출력을 새로 만드니까 언제든 다시 돌릴 수 있어 — 실험이 쉽다는 거야. 한계는 단일 머신에서만 작동한다는 것.
맵리듀스는 이 아이디어를 HDFS 위에서 분산 실행한 거야. 매퍼가 입력에서 키-값 쌍을 추출하고, 키 기준으로 정렬해서, 리듀서가 같은 키의 값을 집계하지. 매퍼를 입력 파일이 있는 머신에서 실행해서 네트워크 트래픽을 최소화하고, 실패한 태스크는 자동으로 재시도해 — 입력이 불변이고 매퍼에 상태가 없으니까 안전하지. 조인도 가능해 — 정렬-병합 조인(양쪽을 같은 키로 정렬해서 리듀서에서 만남), 브로드캐스트 해시 조인(작은 쪽을 해시 테이블로 전 매퍼에 배포), 파티션 해시 조인(같은 파티션끼리만 조인).
하지만 맵리듀스는 매 단계 출력을 HDFS에 구체화해. 중간 결과를 복제까지 하면서 디스크에 쓰는 건 과잉이고, 전 단계가 완전히 끝나야 다음이 시작돼. Spark, Tez, Flink 같은 데이터플로 엔진이 이 문제를 해결했어 — 전체 작업을 연산자의 DAG로 표현하고, 한 연산자의 출력을 다음에 바로 전달하지. 불필요한 매퍼 제거, 필요할 때만 정렬, 입력이 준비되는 대로 시작. 중간 상태 구체화라는 맵리듀스의 내결함성은 잃지만, 실패 시 이전 연산자부터 재계산하면 되니까 실패가 드문 환경에서는 이게 더 효율적이야.
정리
10장 읽고 기억할 거:
- 맵리듀스는 유닉스 철학의 분산 확장. 입력 불변, 출력 새로 생성, 파이프라인 조합 — 유닉스 파이프를 수천 대 머신으로 확장한 것
- 맵리듀스의 한계는 중간 상태 구체화. Spark, Flink 같은 데이터플로 엔진이 DAG 기반으로 해결한다. 중간 결과를 메모리에서 바로 전달하거나 로컬 디스크에만 쓴다
- 핵심은 "코드를 데이터에 가까이, 실패하면 재시도". 방대한 데이터를 처리하면서도 개별 실패에 대한 내결함성을 유지하는 게 분산 일괄 처리의 강점이다