데이터 중심 애플리케이션 설계 | 10장. 일괄 처리
발표자 : 김정수, 박수민
일괄처리 대안
맵리듀스
- 장점: 분산 파일 시스템 상에서 상당히 단순 명료하게 추상화된 모델
- 단점: 복잡한 연산은 매우 힘듬
맵리듀스 중간 상태 구체화
일괄처리 워크플로우에서 각 태스크의 output(중간상태)을 분산 파일 시스템에 파일로 저장(구체화)해두는 방법
(복잡한 연산을 여러 맵리듀스로 분할하여 처리)
- 분산 파일 시스템: 태스크의 output을 파일로 저장하는 장치
- 이 파일은 다른 태스크의 input으로 사용 (주로 태스크 간의 데이터 전달을 위한 용도)
- 중간 상태: 이러한 파일로 저장되어 있는 상태
- 복잡한 워크플로우에서는 매우 많은 중간 상태가 존재
- 구체화: 중간 상태를 파일로 저장하는 과정
- 요청이 왔을 때 결과를 생성하는 것이 아니라 미리 특정 연산 결과를 생성해 두는 것
(유닉스 파이프 대비) 단점
- 선행 작업이 완료되어야 후행 작업 시작 가능
- 유닉스 파이프는 동시에 작업이 진행
- 데이터의 생성과 동시에 소비가 이루어짐
- 워크플로우의 전체 수행 시간이 느리다.
- 유닉스 파이프는 동시에 작업이 진행
- 매퍼 중복
- 매퍼는 리듀서가 생성한 파일을 읽어 파티셔닝과 정렬을 수행
- 불필요한 IO 발생
- 리듀서가 매퍼의 기능도 가지게 함으로써 해결 가능
- 매퍼는 리듀서가 생성한 파일을 읽어 파티셔닝과 정렬을 수행
- 분산 파일 시스템의 모든 장비에 중간 상태 파일들의 복제가 발생
- 중간 상태 파일들은 임시 데이터임에 불구하고, 복제는 분산 파일 시스템을 사용함으로써 발생하는 과도한 비용
데이터플로우 엔진(Dataflow Engine)
맵리듀스의 문제를 해결하기 위한 분산 일괄 처리 연산을 수행하는 엔진 등장
데이터의 흐름을 명시적으로 모델링 한다.
- 스파크(Spark) : 프레임워크
- 테즈(Tez) : 가벼운 라이브러리
- 플링크(Flik) : 프레임워크
프레임워크 : 자체 네트워크 통신 계층, 스케줄러, API 등을 갖춤
https://trends.google.com/trends/explore?cat=32&q=Spark,Tez,Flink
특징
- 워크플로우를 독립된 하위 작업으로 나누지 않고 하나의 작업으로 다룬다.
- (맵리듀스처럼) 단일 스레드에서 사용자 정의 함수를 호출해 레코드 하나씩 처리
- 입력 데이터를 파티셔닝하여 병렬 처리
- 네트워크 복사를 통해 어느 함수의 output이 다른 함수의 input으로 전달된다.
연산자
- 데이터 처리에 사용되는 여러 함수
맵리듀스 모델 대비 장점
- 정렬 등의 high cost 작업은 필요한 경우에만 수행할 수 있다.
- 맵리듀스는 기본적으로 map과 reduce 사이에서 정렬이 항상 발생
- 지역성 최적화가 가능하다.
- 워크플로우가 명시적이므로 어느 데이터가 어느 시점에 필요한지 알 수 있다.
- 함수간의 데이터 전달을 네트워크 복사가 아닌 메모리 공유로 전달할 수 있다. (네트워크 IO 감소)
- 중간상태는 로컬 디스크에 저장한다. (IO 소비 감소)
- HDFS(Hadoop Distributed File System)에 저장할 경우 여러 서버에 복제가 필요하다.
- 연산자들은 input이 발생하는 즉시 수행한다.
- 선행 함수의 전체 종료를 기다리지 않아도 된다.
- 연산자 실행 시 마다 JVM을 띄우지 않아도 된다.
- 맵리듀스는 각 태스크마다 JVM을 새로 구동한다.
데이터플로우 엔진은 맵리듀스의 워크플로우와 동일한 연산을 구현할 수 있고 여러 최적화를 통해 일반적으로 수행속도가 훨씬 빠르다.
연산자는 맵과 리듀스를 일반화한 것이라 맵리듀스의 워크플로우를 수정없이 간단하게 데이터플로우로 전환할 수 있다. (전환 전에 호환여부를 살펴볼 것)
내결함성
맵리듀스는 중간 상태를 모두 구체화하기 때문에 내결함성(내구성)을 쉽게 확보할 수 있다.
데이터플로우 엔진은 HDFS에 중간 상태를 구체화하지 않기 때문에 다른 방법을 사용한다. (HDFS를 사용하지 않는 것은 아니다. 원본 데이터는 HDFS에 있다.)
- 로컬에 input 데이터가 남아있으면 다시 연산을 한다. 없으면 HDFS에서 원본 데이터를 가져와서 연산한다.
재연산을 하기 위한 연산 추적을 한다.
- 어느 입력 파티션을 사용했는지 어떤 연산자를 사용했는지 추적해야 한다.
- 스파크는 RDD(Resilient Distributed Dateset) 추상화를 사용한다.
- RDD: 데이터의 여러 요소를 모은 immutable 분산형 컬렉션
- 플링크는 연산자 상태를 체크포인트로 남겨둔다.
재연산 시 멱등성이 보장되어야 한다.
멱등성 보장을 위해 주의해야할 사항
- 데이터의 검색 등을 위해 해시 테이블을 사용하는 경우 → 해시 테이블은 특정 순서를 보장하지 않는다.
- 연산의 로직이 난수에 의존하는 경우 → 난수가 필요할 경우 고정된 시드 사용 등의 방법으로 난수를 제어
- 시스템 시간, 외부 데이터를 사용하는 경우 → 멱등성을 보장하지 못하는 원인은 제거 그러나 만약 중간 데이터의 크기가 작거나 연산이 CPU 리소스를 많이 사용한다면 재연산보다 중간 데이터를 생성하는 것이 효과적일 수 있다.
구체화에 대한 논의
내용 요약
- 선행 작업의 완료를 기다리지 않아도 된다. (파이프라인 방식으로 실행이 가능)
- 모든 중간 상태를 HDFS에 저장하지 않아도 된다.
그래프와 반복 처리
그래프 데이터 모델에 대한 일괄 처리의 필요성이 확대되고 있다.
- 페이지 랭크 : 웹 페이지 인기도 측정 알고리즘
데이터플로우 엔진에서 데이터 자체는 전형적인 관계형 튜플로 구성된다. 한 연산자에서 다른 연산자로 가는 데이터 흐름이 그래프로 구성된다.
- 일반적으로 연산자를 비순환 방향 그래프로 배열한다.
- 데이터’플로우’ 라고 이름을 잘못지어(그래프가 아닌 것 처럼) 혼란을 초래한다.
데이터는 관계형 튜플(간선-정점)로 구성될 수 있어서 알고리즘(어떠한 데이터 처리하는 방법) 를 반복적인 형태로 구현할 수 있다.
- 맵리듀스로도 구현이 가능하지만 비효율적이다.
- 맵리듀스는 알고리즘의 반복적 속성을 고려하지 않는다.
- 데이터를 일회성으로 처리한다.
- 예: ‘어떤 조건에 만족할 때까지 해당 태스크를 반복한다’ 와 같은 형식으로 구현할 수 없다.
프리글 처리 모델
일괄 처리 그래프를 최적화하는 방법으로 벌크 동기식 병렬(BSP, Bulk Synchronous Parallel) 연산 모델이 널리 사용된다.
BSP 구현체
- 아파치 지라프(Apache Giraph)
- 스파크 그래프 X(Graph X)
- 플링크 젤리(Gelly) API 또한 BSP는 프리글(Pregel) 모델로도 불린다. (구글의 프리글 논문에서 그래프 처리 방법론으로 소개되었고 널리 보급되었다.)
프리글 = 그래프 병렬/분산 처리 프레임워크
- Large-scale의 그래프를 다루는 것은 매우 어렵다. (최적의 알고리즘을 선택해도 processing cost가 지수적으로 증가하는 것이 일반적)
- 그래프의 분산 처리를 위해 사용
- (프리글 자체만으로도 내용이 매우 방대하여 프리글에 대한 자세한 설명 및 책의 내용은 생략)
고수준 API와 언어
분산 일괄 처리 엔진의 발전
- 수만 대의 장비로 구성된 클러스터에서 PB(페타바이트, 1PB = 1,000TB)의 데이터를 저장하고 처리하는데 충분하고 견고해졌다.
- 기술의 성숙으로 기술로 해결할 수 있는 문제의 범위를 확장하는데 노력
스파크와 플링크도 자체 고수준 데이터플로우 API를 가지고 있다.
- 고수준 API를 통해 구현할 연산의 코드를 적게 작성할 수 있다.
- 대화식 사용도 지원하여 코드의 동작을 바로 확인할 수 있다.
결론: 고수준 API를 사용하여 시스템의 생산성을 향상시킬 수 있고, 작업을 더욱 효율적으로 수행할 수 있다.
선언형 질의 언어로 전환
조인이 필요한 연산의 경우, 조인을 수행하는 코드를 작성하는 것 보다 관계형 연산자로 조인을 표현하면 프레임워크가 조인에 사용할 어떤 알고리즘이 적절한지 자동으로 결정할 수 있다는 장점이 있다. (RDB의 join과 비슷)
하이브, 스파크, 플링크는 이러한 질의 최적화기를 내장하고 있다.
- 사용자가 다양한 조인 알고리즘을 모두 알고 있을 필요도, 어떤 알고리즘을 사용할지 고민할 필요도 없다.
- 선언적인 방법을 통하여 optimizer가 최적의 수행 방법을 결정한다.
- 맵리듀스의 경우 사용자가 직접 코드를 작성할 수 있다는 장점이 있다. (그러나 CPU 리소스의 오버헤드 등의 단점도 있다. 맵리듀스, 데이터플로우 엔진 각각의 특징으로 이해하자.)
다양한 분야를 지원하기 위한 전문화
표준화된 처리 패턴이 계속 나타나는 공통 사례가 많다. 그렇기 때문에 재사용 가능한 공통 빌딩 블록을 구현은 중요하다.
통계학, 수치 알고리즘 분야에서도 일괄 처리의 중요성이 증가하고 있다.
- 통계학, 수치 알고리즘 분야는 분류, 추천 시스템과 같은 머신러닝 애플리케이션을 구축하는데 필요하다.
위의 분야에서 재사용 가능한 구현을 한 기술
- 머하웃(Mahaou): 맵리듀스, 스파크, 플링크에서 실행되는 다양한 머신러닝용 알고리즘 구현을 가지고 있다.
- 매드립(MADlib): 관계형 MPP(Massive Parallel Processing) 데이터베이스에 머신러닝 기능을 추가할 수 있는 오픈소스 라이브러리
- K 최근접 이웃(k-nearest neighbor) 알고리즘: 다차원 공간에 주어진 아이템과 근접한 아이템들을 찾는 일종의 유사도 검색 알고리즘
- 유전자 분석 알고리즘에서 중요하게 사용
일괄 처리 시스템은 내장 기능과 고수준 선언적 연산자를 모두 가지고 있어 광범위한 영역에서 필요한 알고리즘을 분산 수행하는데 사용된다.