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();
'프로그래밍 > NoSQL - MongoDB' 카테고리의 다른 글
MongoDB 운영방법 - 백업/복구 (0) | 2017.04.04 |
---|---|
MongoDB 집계 명령 & 리모트 명령 (0) | 2017.04.04 |
mongoDB 리플리카 셋으로 장애 대응방법 배우기 (0) | 2017.04.04 |
MongoDB를 이용한 복제 방법 살펴보기 (0) | 2017.04.04 |
MongoDB 샤딩 (1) | 2017.04.03 |