MapReduce 개념 살펴보기

1. 맵 리듀스(MapReduce)

: 대용량의 데이터를 안전하고 빠르게 처리하기 위한 방법

: 한대 이상의 하드웨어를 활용하는 분산 프로그래밍 모델

: Hadoop은 HDFS(Hadoop File System)이라는 대규모 분산 파일 시스템을 구축하여 탁월한 성능과 안정성을 보여줌

: 맵 리듀스는 대용량 파일에 대한 로그 분석, 색인 구축, 검색에 탁월한 능력을 보여줌

* 맵 리듀스 동작원리

* 맵 리듀스 특징

: 맵 리듀스는 데이터를 분산하여 연산하고 다시 합치는 기술

: 맵 단계는 key-Value의 형태를 가짐 (이 형태는 분산에 있어서 필수적인 형태)

: 맵과 리듀스는 사용자가 임의로 코딩이 가능한 형태로 제공

: 분산을 통해 분할된 조각으로 처리한 뒤, 다시 모아 계산을 완료

* 장/단점

장점

: 대용량 처리를 단순하게 만듬

: 데이터 모델이나, 스키마에 독립적

: 높은 확장성

단점

: RDBMS보다 불편한 스키마

: 낮은 성능, 단순한 데이터 처리

: 개발환경의 불편함과 운영노하우 부족

* 맵리듀스와 RDBMS의 비교

* 맵리듀스와 RDBMS의 관계

: 대용량 처리를 위해 기존의 RDBMS를 보완

: 일관처리 방식으로 전체 데이터 셋을 분석할 필요가 있는 문제에 적합

: 대부분의 클라우드 시스템이 이렇게 운여되고 잇음

2. Hadoop의 HDFS, 맵리듀스

* HDFS 개요

- 구성요소

: 클라이언트 : 데이터 송수신 요청

: 네임 노드 : HDFS 전체 시스템 제어

: 데이터 노드 : 수천대의 서버로 구성, 데이터 저장 역할

- 데이터 처리원칙

: Block size : 파일을 저장하는 단위(64MBor128MB)

: Replication : 모든 블록은 여러 노드에 분산되어 저장(기본3개)

* HDFS 파일 전송 과정

* HDFS파일 수신 과정

* HDFS의 오류 및 장애 대응

: 네임 노드 오류가 발생했을 경우 모든 클러스터가 죽는 문제가 발생한다.

- 데이터 노드 오류 처리

: 데이터 노드는 네임노드에 3초 단위로 heart beat 전송

: 10분동안 받지 못하면 죽었다고 판단.

- 데이터 송수신 시 오류 처리

: 클라이언트가 송신시 데이터 노드는 ACK 응답을 한다.

: ACK응 답이 오지 않으면 죽었거나 네트워크 오류로 판단

- 데이터 체크섬(checksum) 확인

: 데이터 전송시 해당 데이터에 대한 체크섬을 같이 보냄

: 데이터 노드에서 데이터와 체크섬을 같이 저장하여 이를 통해 블록리포트를 작성하여 네임노드에 보낸다.

* 불완전 복제 방지

: 오류 발생으로 복제 개수가 완전하지 않은 블록을 불완전 복제라고 한다.

: 데이터 노드에 새로운 복제소로 복사할 것을 요청하여 개수를 맞춘다.

* 복제 위치 선정 전략

: 클러스터는 여러개의 데이터 노드를 가지는 랙으로 분리됨

: 같은 렉이 아니라 다른 렉에 있는 데이터 노드에 저장하기 위한 알고리즘이 있음

* Hadoop의 맵 리듀스

- 설계 특성

: 분산 컴퓨팅에 적합한 함수형 프로그래밍

: 배치형 데이터 처리 시스템

: 어플리케이션 로직의 주요 관심사를 파악, 많은 요소들 반영

- 주요기능

: 자동화된 병렬처리 및 분산처리

: 프로그래머를 위한 추상 클래스

: 상태 및 모니터링 툴들

* 맵리듀스 과정

: 원본데이터(파일,DB레코드)는 map 함수에 의해서 key-value쌍으로 전환

: map() 함수: 입력을 출력 key와 관련되는 1..N개의  key-value를 생성

: Map 단계 다음에서 출력 key의 중간 value들은 하나의 리스트로 합쳐짐

: reduce() 함수: 같은 출력 key를 가지는 final value로 중간 value들을 통합

* 맵 리듀스 특징


3. MongoDB의 맵 리듀스

* MongoDB 맵 리듀스 특징

: RDBMS에서 제공하는 데이터 집계함수들을 지원하지 않음

: mapreduce를 통해 집계 구현 가능


MapReduce 실행

1. Word Count 개념

: 입력 파일의 텍스트 내용에 포함된 단어의 수를 세는 프로그램

: 입문용 MapReduce 프로그래밍 예제

: 입력파일의 사이즈가 클수록 MapReduce가 효율적이다.

: 두가지 함수를 구현해야 한다.

: map (in_key, in_value) -> (inter_key, inter_value) list

: reduce (inter_key, inter_value list) -> (out_key, out_value) list

* Split Mapper

: 데이타 셋을 Key-Value 의 리스트로 변경하는 map() 함수

> map( String input_key, Sting input_value) : 

// input_key : document name

// input_value : document contents

for each word w in input_value : 

emit(w,1);

* Sum Reducer

> reduce(String output_key, Iterator<int> intermediates_values) :

// output_key : a word

// output_values : a list of counts

int result = 0;

for each v in intermediate_values :

result +=v;

emit(output_key,result);

2. Wod Count 구현

* 맵 리듀스 함수 구현

: MapReduce 데이터 입력

> db.words.save({text:"read a book"});

> db.words.save({text:"write a book"});

: map() 함수 구현

> map = function(){
... var res = this.text.split(" ");
... for (var i in res)
... key = {word:res[i]};
... value={count:1};
... emit(key,value);
... }
... }

: reduce() 함수 구현

> reduce = function(key,values){
... var totalcount = 0;
... for (var i in values){
... totalcount = values[i].count + totalcount;
... }
... return {count:totalcount};
... }

* 맵 리듀스 실행

: MapReduce 명령 실행

> db.words.mapReduce(map,reduce,"wordcount") ;

: MapReduce 실행 결과 확인

> db.wordcount.find();


MapReduce 구현

1. Inverted Search Index 개념

* Inverted Search Index

: value의 내용을 key로 하  고, key의 내용을 반대로 value로 하는 패턴

: 검색엔진에서 많이 사용하는 방법

: 검색 키워드를 키로 해서 URL을 value로 하는 테이블을 다시 만든다음 검색 키워드로 검색하면 신속하게 검색 키워드를 가지고 있는 URL을 찾아낼 수 있음

* Inverted Mapper

: 데이터 셋을 key, value의 리스트로 변경하는 map() 함수

* Inverted Search Index 수행과정

: 엄청난 양의 데이터를 잘라 데이터 노드에게 나누어 준다.

: 각 노드는 맵 함수를 실행시켜 많은 중간 데이터를 만들어 낸다.

: 중간 데이터는 최종적으로 reduce의 input으로 들어가게 되고, 최종 결과를 만든다.

2. Inverted Search Index 구현

* 맵 리듀스 실행

: MapReduce 데이터 입력

> db.actors.save({actor:"Richard Gere", movies:{'Pretty Woman','Runaway Bridge','Chicago'}});

: map() 함수 구현

> map =function() {
... for (var i in this.movies){
... key = {mvie : this.movies[i]};
... value = {actors:[this.actor]};
... emit(key, value);

: reduce() 함수 구현

> reduce = function(key,values){
... actor_list = {actors:[]};
... for(var i in values){
... actor_list.actors = values[i].actors.concat(actor_list.actors);
... }
... return actor_list;
... }

: MapReduce 명령 실행

> db.actors.mapReduce(map,reduce,"pivot");

: 실행결과 확인

> db.pivot.find();



+ Recent posts