10. 일괄 처리

시스템은 크게 세가지 유형으로 구분 가능

  • 서비스 : 클라이언트 요청시 응답
  • 일괄처리 (배치): 큰 입력 데이터 받아서 처리하고 시간이 오래 걸리며 사용자가 응답대기하지 않음
  • 스트림처리: 서비스와 일괄처리 그 중간 어디즘, 준실시간 처리, 입력 이벤트가 발생한 직후 바로 작동

맵리듀스는 구글을 대규모로 확장 가능하게 만든 알고리즘 많은 오픈소스 시스템에서 구현됨 (하둡, 카우치, 몽고 등등)

유닉스 도구로 일괄 처리하기

유닉스 파이프라인 예제는 정렬된 목록에서 같은 URL이 반복해서 나타남

단순 로그 분석

유닉스 철학

이는 유닉스 핵심 설계 아이디어로, 유닉스 철학은 다음과 같다

  1. 한가지만 잘하자
  2. 모든 출력은 다른 프로그램의 입력으로 쓰일수도 있다
  3. 빠르게 써볼 수 있게 설계하고 구축하라
  4. 미숙한 도움보다 도구를 사용하자

맵리듀스와 분산 파일 시스템

맵리듀스 데이터 처리 패턴은 로그분석 예제와 상당히 비슷

  1. 입력 파일 읽고 레코드로 쪼갬
  2. 입력마다 매퍼 함수 호출해 키와 값 추츨
  3. 키를 기준으로 키 값 쌍 정렬
  4. 정렬된 키 값 쌍 전체를 대상으로 리듀스 함수 호출 가장 큰 차이점은 맵리듀스가 병렬로 수행하는 코드를 직접 작성하지 않고 여러 장비에서 동시에 처리 가능

    맵리듀스 작업 실행하기

    맵리듀스 작업을 연결해 워크플로우를 구성한다 일괄 처리 작업의 출력은 작업이 성공적으로 끝났을때만 유효하다

리듀스 사이드 조인과 그룹화

데이터베이스에서는 일반적으로 인덱스를 사용해 관심있는 레코드 위치 빨리 찾는다 하지만 맵리듀스는 색인 개념이 없고 full table scan을 한다 -> 즉 일괄처리 맥락에서 조인은 데이터셋 내 모든 연관관계를 다룬다는 뜻이다 이를 일괄처리 하기 위해 데이터베이스의 사본을 가져와 사용자 이벤트 로그가 저장된 분산 파일 시스템에 모은다 맵리듀스 프레임워크에서 키로 매퍼의 출력을 파티셔닝해 키 값 쌍으로 정렬한다. 리듀서는 특정 사용자 id의 모든 레코드를 한번에 처리하므로 한번에 사용자 한명의 레코드만 메모리에 유지하면 되고 네트워크 요청은 필요 없다 (정렬 병합 조인 알고리즘) 쏠림다루기 - 제니같은 핵인싸 (린치핀 객체, 핫키) 핫키 완화용 알고리즘중 하나로 쏠림조인 메서드가 있다 샘플링을 수행하며 핫키를 여러 리두서에 퍼뜨려서 처리하게끔 하는 방법이다

맵 사이드 조인

조인 로직을 리듀서에서 수행하기 때문에 리듀스 사이드 조인이었는데, 이 방법 사용시 장점은 입력 데이터에 대한 특정 가정이 필요없다 하지만 정렬 후 리듀서로 복사한뒤 리듀서에서 병합하는 모든 과정에 드는 비용이 상당하다 반면 입력 데이터에 대한 특정 가정이 가능한 경우 맵사이드 조인 기법을 사용해 조인을 더 빠르게 수행할 수 있다 매퍼가 할 작업을 각 분산 파일 시스템에서 파일 블럭 하나 읽어서, 해당 분산 파일 시스템에 출력한다

일괄 처리 워크플로의 출력

분석 질의에 대해 일반적으로 일괄처리 방식을 사용한다 검색색인 구축을 위해서 구글에 처음 맵리듀스가 사용되었다 정해진 문서 집합을 대상으로 전문 검색이 필요하다면 일괄처리가 색인을 구축하는데 효율적이다 색인된 문서 집합이 변한다면 주기적으로 재수행 하거나, 증분 색인을 구축할 수 도 있다 만약 애플리케이션에 이를 서빙해야 하는 경우, 일괄처리 작업 내부에 새로운 데이터베이스 구축해 출력 디렉터리에 저장하는 방법이 효율적이다 입력이 불변이기 때문에 부수효과가 없고, 좋은 성능을 내면서도 유지보수가 훨씬 간단하다

하둡과 분산 데이터베이스의 비교

맵리듀스 + HDFS조합은 아무 프로그램이나 실행할 수 있다는게 장점이다 HDFS 파일은 연속된 바이트 일 뿐이기 때문에 어떤 형태의 ㄷ이터도 가능 제약없는 데이터덤핑 (원본 데이터 걍 막 연결하는게) 오히려 데이터 해석 부담을 이전시키고, 원시 상태로 데이터 덤프 하는 것만으로도 변환가능 하둡이 ETL 프로세스 구현하는데 사용되는 이유 처리 모델의 다양성 - SQL로 질의가 가능 맵리듀스는 맵 또는 리스크 태스크의 실패를 견딜수 있게 설계되었다

맵리듀스를 넘어

맵리듀스 고수준 프로그래밍 모델 사용하면 배우기 쉽고 구현이 용의하다 하지만 맵리듀스 실행 모델 자체에도 문제가 있으며 몇가지 소개한다.

중간 상태 구체화

한 작업의 출력(중간상태)가 존재하며, 중간상태를 파일로 기록하는 과정을 구체화라고 한다 이 구체화는 맵리듀스 접근법은 유닉스 파이프에 비해 여러 단점이 있다 이걸 해결하기 위해 분산 일괄 처리 연산 수행하는 엔진이 새롭게 몇가지 개발되었고 그 가운데 스파크가 있다 중간상태 구체화 하면 내구성에 대해 이점이 생긴다 (상태가 결정적이어야 한다)

그래프와 반복 처리

효율적인 병렬 그래프 알고리즘은 지금도 연구가 진행중인 분야다

고수준 API 언어

고수준 인터페이스는 코드를 적게 작성해도 되고, 대화식 사용도 지원한다 -> 생산성 높아지고, 작업 효율적으로 수행가능

정리