MapReduce

: 구글에서 분산 병렬 컴퓨팅을 이용하여 대용량 데이터를 처리하기 위한 목적으로 제작한 소프트웨어 프레임워크

: 분할정복 방식으로 대용량 데이터를 병렬로 처리할 수 있는 프로그래밍 모델

: 맵리듀스에서 Client의 수행 작업 단위맵리듀스 잡(MapReduce Job)이라고 하며, 잡(Job)은 Map TaskReduce Task로 나뉘어서 실행된다.

: Map Task 하나가 1개의 블록(64MB)을 대상으로 연산을 수행

 

프로그래밍 모델 : Map과 Reduce라는 2개의 단계로 나눌 수 있음

: Map에서는 Key와 Value의 쌍들을 입력으로 받는다

: 하나의 Key, Value 쌍은 사용자가 정의한 Map 함수를 거치면서 다수의 새로운 Key, Value 쌍들로 변환되어 로컬 파일시스템에 임시 저장된다

: 저장된 임시 파일들은 프레임워크에 의해 Reduce에게 전송된다. 이 과정에서 자동으로 Shuffling과 Group by 정렬의 과정을 거친 후 Reduce의 입력 레코드로 들어가게 되는데 형식은 Key와 Value의 리스트이다.

: Reduce의 입력 레코드들은 사용자가 정의한 Reduce 함수를 통해 최종 Output 으로 산출된다.

 

실행 과정

: 하나의 큰 파일은 여러 개의 파일 Split들로 나뉘며, 각 Split들이 Map 프로세스들의 할당 단위가 된다. Split 수만큼 Map Task드이 워커로부터 Fork됨

: 동일한 Key들은 같은 Reduce로 배정된다

: 분산 Grep이나 빈도 수 계산 등의 작업은 적합하지만, 정렬과 같은 작업은 적합하지 않음

 

폴트톨러런스

: 각 프로세스에서는 Master에게 Task 진행 상태를 주기적으로 보낸다

: MapReduce는 Shared Nothing 아키텍처이기 때문에 간단한 메커니즘을 가진다.

 

Hadoop Mapreduce

: 아파치 오픈소스 프로젝트인 하둡의 MapReduce는 구글에서 발표한 논문을 바탕으로 하여 자바 언어로 구현된 시스템

: 하둡은 데몬 관점에서 4개의 구성 요소를 가지고 있음

- 네임노드

- 데이터노드

- 잡트래커

- 태스크트래커

: JobTracker는 작업을 다수의 Task로 쪼갠 후, 데이터 지역성을 보장하기 위해 그 Task들을 어떤 Task Tracker에게 보낼지를 감안내부적으로 스케줄링 해 큐에 저장

: Task는 맵퍼나 리듀서가 수행하는 단위 작업을 의미

: TaskTracker는 JobTracker에게 3초에 한 번씩 주기적으로 하트비트를 보내 살아있다는 것을 알린다

 

Hadoop MapReduce의 실행절차(워드카운트(Word Count) 예제 수행 과정 순서)

1. 스플릿(Split) : HDFS의 대용량 입력 파일을 분리하여 파일스플릿을 생성하고, 파일스플릿 하나당 맵 태스크 하나씩 생성

2. 맵(Map) : 각 스플리트에 대해서 레코드 단위로 Map 함수를 적용하여 Key-Value 쌍을 생성

3. 컴바인(Combine) : 리듀스와 동일한 프로그램을 적용하여, 리듀스 단계로 데이터를 보내기 전에 중간 결과값들을 처리하여 데이터의 크기를 줄여준다.

4. 파티션(Partition) : key를 기준으로 데이터를 디스크에 분할 저장하며, 각 파티션은 키를 기준으로 정렬이 수행된다. 또한 분할된 파일들은 각각 다른 리듀스 태스크에 저장된다

5. 셔플(Shuffle) : 여러 맵퍼들의 결과 파일을 각 리듀서에 할당하고, 할당된 파일을 로컬 파일 시스템으로 복사한다.

6. 정렬(Sort) : 병합 정렬 방식을 이용하여 맵퍼의 결과 파일을 Key를 기준으로 정렬한다

7. 리듀스(Reduce) : 정렬 단계에서 생성된 파일에 대해 리듀스 함수를 적용한다

 

하둡의 성능

: MapReduce의 Sort는 MapReduce에서 어떠한 작업을 실행하더라도 Map에서 Reduce로 넘어가는 과정에서 항상 발생하는 내부적인 프로세스이다, Sort 작업은 데이터가 커질수록 처리 시간이 선형적으로 증가한다

 

 

병렬 쿼리 시스템

: 스크립트나 사용자에게 친숙한 쿼리 인터페이스를 통해 병렬 처리를 할 수 있는 시스템

: 대표적으로 구글의 Sawzall, 야후의 Pig 등이 있으며, 이들은 사용자가 MapReduce를 쉽게 사용할 수 있도록 새로운 쿼리 언어로 추상화된 시스템들

 

구글 Sawzall

: 구글 Sawzall는 MapReduce를 추상화한 최초의 스크립트 형태 병렬 쿼리 언어

: 이후에 나온 오픈소스 프로젝트인 Pig나 하이브(Hive)도 개발 배경과 기본적인 개념은 Sawzall과 유사

 

아파치 Pig

: 아파치 Pig는 야후에서 개발해 오픈소스 프로젝트화한 데이터 처리를 위한 고차원 언어

Hadoop MapReduce 위에서 동작하는 추상화된 병렬 처리 언어이며, 아파치 하둡의 서브 프로젝트에 속한다

: 실제 대부분의 업무는 한번의 MapReduce 작업으로 끝나지 않는 경우가 많음 이를 해결하기 위해 의미적으로는 SQL과 비슷하지만 새로운 언어인 Pig를 정의하게 되었다

: MapReduce는 무공유 구조이기 때문에 Join 연산을 매우 복잡하게 처리해야 하지만, Pig를 사용하면 단 10라인의 코드로 간단히 해결할 수 있음

 

아파치 하이브

: 하이브는 페이스북에서 개발한 데이터 웨어하우징 인프라로 아파치 내의 하둡 서브 프로젝트로 등록돼 개발되고 있음

: Pig와 마찬가지로 하둡 플랫폼 위에서 동작하며, 사용자가 쉽게 사용할 수 있도록 SQL 기반의 쿼리 언어와 JDBC를 지원

: 하둡에서 가장 많이 사용하는 병렬처리 기능인 Haddop-Streaming을 쿼리 내부에 삽입해 사용할 수 있음

: 아파치 하이브는 맵리듀스의 모든 기능을 지원

 

아파치 하이브 아키텍처

: 하이브의 구성요소 중에서 Meta Store는 Raw File 들의 콘텐츠를 일종 테이블 내 칼럼처럼 구조화된 형태로 관리할 수 있게 해주는 스키마 저장소

: 별도의 DBMS를 설정하지 않으면 Embedded Derby를 기본 데이터베이스로 사용

 

하이브의 언어 모델

: DDL, DML, Query

 

SQL on 하둡

: 실시간 처리라는 측면에서 하둡의 제약사항을 극복하기 위한 시도 중 하나인 SQL on 하둡은 실시간 SQL 질의 분석 기술

 

임팔라

: SQL on 하둡 기술 중 먼저 대중에게 공개된 기술

: 임팔라는 분석과 트랜잭션 처리를 모두 지원하는 것을 목표로 만들어진 SQL 질의 엔진

: 하둡과 Hbase에 저장된 데이터를 대상으로 SQL 질의를 할 수 있음

: 고성능을 낼 수 있도록 자바 대신 C++ 언어를 사용하였으며, 맵리듀스를 사용하지 않고 실행 중에 최적화된 코드를 생성해 데이터를 처리

 

임팔라의 구성요소

- 클라이언트

- 메타스토어

- 임팔라 데몬

- 스테이트 스토어 : 임팔라 데몬들의 상태를 체크하고 건강정보를 관리해주는 데몬

- 스토리지 : 현재는 HBase, HDFS의 두가지를 지원

 

임팔라 동작 방식

: 모든 노드에 임팔라 데몬이 구동

: 사용자의 질의는 데이터의 지역성을 고려해서 노드 전체로 분산되어 수행된다

: 실제 운영 환경에서는 라운드 로빈 방식으로 사용자 질의를 분산시켜서 질의에 대한 전 노드들이 코디네이터 역할을 고르게 수행할 수 있도록 해야 한다

 

임팔라의 SQL 구문

: 데이터 정의 언어, 데이터 조작 언어, 내장 함수

 

임팔라 데이터 모델

: 임팔라는 하둡 분산 파일시스템에 데이터를 저장하며, 어떤 저장 포맷을 사용하느냐에 따라 데이터 조회시 처리 성능이 달라짐

: 저장 포맷별 특징

- 로우 단위로 저장 : 테이블에서 하나의 컬럼을 읽든 전체 테이블을 읽든 동일한 디스크 입출력이 발생

- 컬럼 단위의 저장 : 읽고자하는 칼럼만큼의 디스크 입출력이 발생하기 때문에 처리 성능을 개선할 수 있음, 로우 단위 파일 포맷을 사용했을 때보다 처리 시간이 적게 걸리므로 처리 시간의 측면에서 더 효율적

 

 

 

 

+ Recent posts