0. 일괄 처리
- 일괄 처리는 대규모 데이터를 처리하는 중요한 방식으로, 서비스(온라인), 일괄 처리(오프라인), 스트림 처리(준실시간)와 구분한다.
- 일괄 처리 시스템은 대용량 입력 데이터를 받아 처리하고 결과 데이터를 생산하며, 작업 시간이 길어 사용자의 즉각적인 대기 없이 반복적인 일정으로 수행된다.
- 주요 성능 지표는 처리량이다.
- 일괄 처리는 신뢰할 수 있고 확장 가능하며 유지보수하기 쉬운 애플리케이션 구축에 중요한 구성요소 이다.
1. 유닉스 도구로 일괄 처리하기
1.1. 단순 로그 분석
cat
,awk
,sort
,uniq
,head
등의 명령으로 파이프로 연결하여 로그에서 특정 정보를 추출하고, 정렬 및 집계하는 작업을 수행할 수 있다.- 대용량 파일을 효율적으로 처리하며 분석 방법을 쉽게 수정할 수 있는 유연성을 제공한다.
- 정렬 기반 접근법과 인 메모리 집계(해시 테이블)는 데이터 규모에 따라 효율이 다르다.
- 유닉스의
sort
는 메모리보다 큰 데이터셋도 디스크를 활용하여 처리하고 병렬 정렬을 지원한다.
1.2. 유닉스 철학
- 유닉스 철학
- 각 프로그램은 한 가지 일만 잘 수행하도록 작성한다.
- 프로그램 출력은 다른 프로그램의 입력으로 사용될 수 있다고 생각한다.
- 소프트웨어를 빠르게 개발하고 개선한다.
- 반복 작업을 줄이기 위해 도구를 활용해라.
- 이러한 원칙은 오늘날의 애자일 및 DevOps 문화와 흡사하다.
- 유닉스 도구는 파일 및 파이프를 통한 동일 인터페이스를 사용하여 쉽게 결합되어 웹이 URL과 HTTP를 통해 서로 다른 사이트를 연결하는 것과 유사하다.
- 표준 입출력(stdin, stdout) 사용은 로직과 연결을 분리하여 프로그램의 유연성을 높힌다.
- 유닉스 도구는 입력의 불변성, 중간 출력 확인 기능, 재시작 가능성 등으로 투명성과 실험에 용이하다.
2. 맵리듀스와 분산 파일 시스템
- 맵리듀스는 유닉스 도구와 유사하지만 수천 대 장비에 분산 실행이 가능하다는 차이가 있다.
- 맵리듀스 작업은 분산 파일 시스템(HDFS, GlusterFS, QFS 등)을 입출력으로 사용한다.
- HDFS는 비공유 원칙을 기반으로 하며 데이터 복제를 통해 결함에 대비하고 뛰어난 확장성으로 대규모 데이터 처리가 가능하다.
2.1. 맵리듀스 작업 실행하기
- 맵리듀스 작업은 입력 레코드를 처리하는 매퍼(Mapper)와 결과를 집계하는 리듀서(Reducer) 함수로 구성된다.
- 매퍼는 모든 입력 레코드마다 호출되어 키와 값을 추출한다.
- 리듀서는 같은 키를 가진 값의 집합을 받아 처리하고 출력 레코드를 생산한다.
- 맵리듀스 프레임워크는 매퍼 출력을 같은 키의 기준으로 모으고 정렬하여 리듀서에 전달한다. (셔플)
- 맵리듀스는 병렬 처리를 지원하며, 데이터 지역성 원리를 적용하여 처리 효율을 높힌다. 작업 할당 시 코드도 함께 복사된다.
2.2. 리듀스 사이드 조인과 그룹화
- 일괄 처리에서 조인(join)은 데이터셋 간의 모든 연관 관계를 처리하며, 색인 대신 전체 스캔이 일반적이다.
- 정렬 병합 조인 - 사용자 활동 이벤트 분석 예시
- 매퍼에서 조인키를 추출하고 셔플 과정을 통해 같은 키가 레코드를 같은 리듀서로 모은다.
- 리듀서는 정렬된 레코드를 병합하여 조인 결과를 생성한다.
- 이 방식은 필요한 데이터를 한 곳에 모아 효율적인 처리를 가능하게 한다.
- 그룹화
- SQL의 GROUP BY와 유사하게 특정 키로 레코드를 그룹화하는 연산도 맵리듀스에서 키를 기준으로 데이터를 모아 리듀서에서 집계하는 방식으로 구현된다.
- 사용자 세션별 활동 이벤트를 수집 분석할 때에도 그룹화를 사용하는데 세션화(sessionization)라고 한다.
- 쏠림 다루기
- 린치핀 객체(핫 키)와 같은 데이터 쏠림 현상은 특정 리듀서에 부하를 집중시켜 성능을 저하한다.
- 쏠림 조인 등의 기법은 핫 키 데이터를 여러 리듀서에 분산시켜 처리함으로써 핫스팟을 완화한다.
2.3. 맵 사이드 조인
- 리듀서나 정렬 없이 매퍼에서 조인을 수행하여 효율을 높이는 방식이다.
- 브로드캐스트 해시 조인
- 작은 데이터셋을 메모리 해시테이블에 적재하고 큰 데이터셋을 스캔하여 조회한다.
- 작은 데이터셋이 모든 매퍼에 브로드캐스트되는 것과 유사하다.
- 파티션 해시 조인
- 조인 입력 두 개를 같으 방식으로 파티셔닝한 후 각 파티션별로 해시 조인을 독립적으로 수행한다.
- 각 매퍼가 처리할 데이터 양을 줄인다.
- 맵 사이드 병합 조인
- 입력 데이터셋이 파티셔닝되고 정렬되어 있다면 매퍼에서 병합 조인을 사용할 수 있다.
- 입력 데이터의 크기, 정렬, 파티셔닝에 제약이 있으며 데이터셋의 물리적 레이아웃 파악이 중요하다.
2.4. 일괄 처리 워크플로의 출력
- 일괄 처리 작업의 출력은 보고서 형태 외에 검색 색인 또는 머신러닝/추천 시스템의 기반 데이터베이스 형태를 가진다.
- 일괄 처리 작업에서 생산된 데이터를 외부 데이터베이스에 직접 기록하는 것은 성능 저하 및 부수 효과 문제로 선호되지 않는다.
- 일괄 처리 작업 내부에 새로운 데이터베이스 파일을 구축하여 분산 파일 시스템에 저장하고, 이를 읽기 전용으로 제공하는 방식이 좋다.
- 볼드모트, HBase 벌크 적재 등이 이러한 기능을 제공.
- 일괄 처리 작업의 출력 철학은 입력의 불변성, 부수 효과 없음, 출력의 완전한 교체 등으로 유지보수 및 복구에 유리하여 실패한 태스크는 안전하게 재시도 된다.
2.5. 하둡과 분산 데이터베이스의 비교
- 하둡은 유닉스의 분산 버전과 유사하며, MPP(대규모 병렬 처리) 데이터베이스와 비교된다.
- 저장소의 다양성
- 하둡의 분산 파일 시스템은 데이터 모델에 제약이 없어 다양한 형태의 데이터를 저장할 수 있으며 스키마 설계는 나중에 고려하여 데이터 수집의 속도를 올릴 수 있다. (데이터 호수(Data lake))
- MPP 데이터베이스는 데이터를 가져오기 전에 신중한 모델링이 필요하다.
- 처리 모델의 다양성
- MPP 데이터베이스는 주로 SQL 분석 질의에 초점을 맞춘다.
- 하둡은 맵리듀스 외에도 SQL, 머신러닝 등 다양한 처리 모델을 지원하는 유연성이 있다. 동일 클러스터에서 다양한 작업 부하를 지원하여 데이터 이동 없이 처리가 가능하다.
- 빈번하게 발생하는 결함을 줄이는 설계
- 맵리듀스는 태스크 실패 시 전체 작업 재수행 없이 개별 태스크 수준에서 복구하며 데이터를 디스크에 자주 기록한다. 태스크 종료가 빈번한 환경에 적합하다. (구글 선점형 스케쥴링)
- MPP 데이터베이스는 장비 장애 시 전체 질의가 중단되는 경우가 많다.
3. 맵리듀스를 넘어
- 맵리듀스는 분산 시스템 이해에 유용하지만, 복잡한 구현과 비효율성이 단점이다.
- 고수준 언어와 API가 이러한 문제를 일부 해결한다.
3.1. 중간 상태 구체화
- 맵리듀스는 분산 파일 시스템에 중간 상태를 구체화하여 내결함성을 확보하지만 유닉스 파이프에 비해 여러 단점을 가진다.
- 단점: 느린 수행 시간, 중복 작업, 과도한 I/O
- 스파크, 테즈 플링크와 같은 데이터플로 엔진은 중간 상태 구체화를 피하고 메모리나 로컬 디스크를 활용하여 효율을 높힌다.
- 데이터플로 엔진은 전체 워크플로를 하나의 작업으로 다루고, 연산자 간 데이터 흐름을 명시적으로 모델링하며, 맵리듀스보다 유연하고 최적화된 실행을 제공한다.
- 내결함성은 중간 데이터 재계산이나 체크포인트를 통해 확보하며 연산이 결정적인지 파악하는 것이 중요하다.
3.2. 그래프와 반복 처리
- 그래프 데이터 처리는 머신러닝, 추천 시스템 등에 중요하며 페이지랭크가 대표적인 알고리즘이다.
- 많은 그래프 알고리즘은 반복적인 연산을 포함하며, 맵리듀스는 이러한 반복 처리에 비효율적이다.
- 프리글(Pregel) 모델은 일괄 처리 그래프 처리에 최적화된 모델(벌크 동기식 병렬: BSP)이며 정점 간 메시지 전달 및 반복 간 상태 유지를 통해 효율을 높힌다.
- 프리글은 체크포인트 저장을 통해 내결함성을 확보하며, 프레임워크가 그래프 파티셔닝 및 메시지 라우팅을 담당한다.
3.3. 고수준 API와 언어
- 하이브, 피그 등 고수준 언어/API는 맵리듀스 작업 작성을 용이하게 하며, 데이터플로 엔진으로 전환 시 코드 수정 없이 설정 변경만으로 가능할 수 있다.
- 스파크, 플링크 등도 관계형 연산자 기반의 고수준 데이터플로 API를 제공한다.
- 고수준 인터페이스는 코드 작성량을 줄이고 대화식 사용을 지원하며, 질의 최적화 기능을 통해 성능을 향상시킨다.
- 일괄 처리 프레임워크는 임의 코드 실행 유연성을 유지하면서도 선언적 기능을 통합하며 MPP 데이터베이스와 유사해지고 있다.
- 통계, 수치 알고리즘 머신러닝 등 다양한 분야를 지원하기 위한 전문화된 라이브러리(머하웃)가 개발되고 있다.
- k 최근접 이웃 알고리즘 같은 공간 알고리즘을 사용하여 머신러닝 애플리케이션(분류, 추천 시스템)등에서 유사도 검색을 위해 사용된다.