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> # 진행 메시지 표시})
- map function : 해당 컬랙션에서 분석 대상 필드를 emit 함수를 이용하여 정의하는 함수
- reduce function: 컬렉션에서 데이터를 분석 및 통계 작업을 수행하는함수
- Finalize: 처리된 결과를 집계하는 함수
- 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');