08-19 MapReduce

Ruinak·2021년 8월 19일
0

Bigdata Lesson

목록 보기
18/18
post-thumbnail

1. 맵 리듀스 개념

MapReduce

맵 리듀스 동작원리

맵리듀스 특징

맵 리듀스 장점/단점

맵 리듀스와 RDBMS의 비교

맵 리듀스와 RDBMS의 관계

2. Hadoop의 HDFS, 맵 리듀스

HDFS(Hadoop Distribute File System) 개요

HDFS 파일 전송 과정

HDFS 파일 수신 과정

HDFS의 오류 및 장애 대응

  • 네임노드 오류 : 모든 클러스터가 죽는 문제 발생(치명적)

불완전 복제 방지

복제 위치 선정 전략

Hadoop 맵 리듀스

맵 리듀스 과정

맵 리듀스 특징

3. MongoDB 맵 리듀스

MongoDB 맵 리듀스 특징

Hadoop과 MongoDB 맵 리듀스 성능 비교

4. Word Count MapReduce 구현

Word Count

Split Mapper

sum Reducer

Word Count 프로그램 로직

Word 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()

문법

db.collection_name.mapReduce(
  <map> #map 함수 이름
  <reduce> #reduce 함수 이름
  {
    <out> # 실행결과를 저장할 collection 명
    <query> # 검색조건
    <sort> # sorting 조건
    <Limit> # 데이터 검색 조건
    <finalize> #실행결과를 집계하게 될 함수 이름
    <scope>
    <jsMode>
    <verbose> # 진행 메시지 표시})
  1. map function : 해당 컬랙션에서 분석 대상 필드를 emit 함수를 이용하여 정의하는 함수
  2. reduce function: 컬렉션에서 데이터를 분석 및 통계 작업을 수행하는함수
  3. Finalize: 처리된 결과를 집계하는 함수
  4. mapReduce 함수 : map Function과 Reduce Function에 의해 리턴된 데이터를 이용해 결과 (output)를 출력하는 함수

Filnalize 함수

  • 맵리듀스 최종결과에 추가적인 처리를 더하거나 최종 결과를 변경하고자 할때 사용
  • 형식
function(key, reducdValue) {
  …
  return modifiedObject;
}

5. 증분 맵리듀스(incremental MapReduce)

  • 특정 도규먼트가 계속 증가할때, 매일 맵리듀스를 수정하는 것이 아니라 증가한 만큼의 도규먼트만 맵리듀스를 수행해서 그 결과를 기존 맵리듀스 결과와 병합하는 방식으로 작업하는 것

6. 맵리듀스 함수 개발시 주의 사항

  • Map 함수에서 호출하는 emit() 함수의 두번째 인자와 Reduce 함수의 리턴값은 같은 포맷이여야 함
  • Reduce 함수와 연산 작업은 멱등(Idempotent)이여야 함

실습

MongoDB 서버 실행

mongod --dbpath c:\devtools\util\mongodb\data

Mongo 실행

mongo

데이터 입력

use test
show collections
db.words.save({test:"read a book"})
db.words.save({test:"write a book"})
db.words.find()
var map=function(){
	var res=this.text.split(" ");
	for(var i in res){
		key={words:res[i]};
		value={count:1};
		emit(key, value);
	}
}
var reduce=function(key, values){
	var totalcount=0;
    for(var i in values){
    	totalcount=values[i].count + totalcount;
    }
    return {count:totalcount};
}
db.words.mapReduce(map, reduce, 'wordcount');
profile
Nil Desperandum <절대 절망하지 마라>

0개의 댓글