Chapter 10

일괄 처리

  • 10.1 유닉스 도구로 일괄 처리하기
  • 10.2 맵리듀스와 분산 파일 시스템
  • 10.3 맵리듀스를 넘어서

맵리듀스는 결국 유닉스 철학을 수천 대의 머신으로 확장한 것이야. 입력은 불변, 출력은 새로 생성, 파이프라인으로 조합 — 이 원칙이 단일 머신에서도, 분산 시스템에서도 동일하게 강력하거든.

유닉스에서 awk | sort | uniq | head로 수 GB 로그를 몇 초 만에 처리할 수 있는 건, 각 프로그램이 한 가지 일을 잘 하고, 균일한 인터페이스(파일 = 바이트열 스트림)로 연결되기 때문이야. 이 조합 가능성이 핵심이지. 그리고 입력을 안 건드리고 출력을 새로 만드니까 언제든 다시 돌릴 수 있어 — 실험이 쉽다는 거야. 한계는 단일 머신에서만 작동한다는 것.

맵리듀스는 이 아이디어를 HDFS 위에서 분산 실행한 거야. 매퍼가 입력에서 키-값 쌍을 추출하고, 키 기준으로 정렬해서, 리듀서가 같은 키의 값을 집계하지. 매퍼를 입력 파일이 있는 머신에서 실행해서 네트워크 트래픽을 최소화하고, 실패한 태스크는 자동으로 재시도해 — 입력이 불변이고 매퍼에 상태가 없으니까 안전하지. 조인도 가능해 — 정렬-병합 조인(양쪽을 같은 키로 정렬해서 리듀서에서 만남), 브로드캐스트 해시 조인(작은 쪽을 해시 테이블로 전 매퍼에 배포), 파티션 해시 조인(같은 파티션끼리만 조인).

하지만 맵리듀스는 매 단계 출력을 HDFS에 구체화해. 중간 결과를 복제까지 하면서 디스크에 쓰는 건 과잉이고, 전 단계가 완전히 끝나야 다음이 시작돼. Spark, Tez, Flink 같은 데이터플로 엔진이 이 문제를 해결했어 — 전체 작업을 연산자의 DAG로 표현하고, 한 연산자의 출력을 다음에 바로 전달하지. 불필요한 매퍼 제거, 필요할 때만 정렬, 입력이 준비되는 대로 시작. 중간 상태 구체화라는 맵리듀스의 내결함성은 잃지만, 실패 시 이전 연산자부터 재계산하면 되니까 실패가 드문 환경에서는 이게 더 효율적이야.


정리

10장 읽고 기억할 거:

  1. 맵리듀스는 유닉스 철학의 분산 확장. 입력 불변, 출력 새로 생성, 파이프라인 조합 — 유닉스 파이프를 수천 대 머신으로 확장한 것
  2. 맵리듀스의 한계는 중간 상태 구체화. Spark, Flink 같은 데이터플로 엔진이 DAG 기반으로 해결한다. 중간 결과를 메모리에서 바로 전달하거나 로컬 디스크에만 쓴다
  3. 핵심은 "코드를 데이터에 가까이, 실패하면 재시도". 방대한 데이터를 처리하면서도 개별 실패에 대한 내결함성을 유지하는 게 분산 일괄 처리의 강점이다