MongoDB의 MapReduce 소개

7539 단어
MongoDB MapReduce
MapReduce는 쉽게 말하면 대량의 작업(데이터) 분해(MAP)를 실행한 다음 결과를 최종 결과(REDUCE)로 통합하는 계산 모델이다.이렇게 하면 임무가 분해된 후에 대량의 기계를 통해 병행 계산을 할 수 있어 전체 조작의 시간을 줄일 수 있다는 장점이 있다.
위는MapReduce의 이론적 부분이고 아래는 실제 응용을 말하며 아래는MongodBMapReduce를 예로 들어 설명한다.
다음은 MongodB의 공식 예입니다.
 
  
> db.things.insert( { _id : 1, tags : ['dog', 'cat'] } );
> db.things.insert( { _id : 2, tags : ['cat'] } );
> db.things.insert( { _id : 3, tags : ['mouse', 'cat', 'dog'] } );
> db.things.insert( { _id : 4, tags : []  } );

> // map function
> map = function(){
...    this.tags.forEach(
...        function(z){
...            emit( z , { count : 1 } );
...        }
...    );
...};

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

db.things.mapReduce(map,reduce,{out:'tmp'})
{
    "result" : "tmp",
    "timeMillis" : 316,
    "counts" : {
        "input" : 4,
        "emit" : 6,
        "output" : 3
    },
    "ok" : 1,
}
> db.tmp.find()
{ "_id" : "cat", "value" : { "count" : 3 } }
{ "_id" : "dog", "value" : { "count" : 2 } }
{ "_id" : "mouse", "value" : { "count" : 1 } }


예는 매우 간단하다. 하나의 탭 시스템에서 모든 탭이 나타나는 횟수를 계산한다.
이 안에서 emit 함수를 제외하고는 모든 것이 표준 js 문법이다. 이emit 함수는 매우 중요하다. 이렇게 이해할 수 있다. 계산이 필요한 모든 문서(mapReduce에서 문서를 필터할 수 있기 때문에 다음에 이야기할 것이다)가 맵 편지를 실행하면 맵 함수는 키 로 되돌아온다.values 쌍, 키는 emit의 첫 번째 매개 변수 키이고,values는 같은 키의 emit에 대응하는 n개의 두 번째 매개 변수로 구성된 수조입니다.이 키values는 매개 변수로 Reduce에 전달되며 각각 1.2개의 매개 변수로 전달됩니다.
reduce 함수의 임무는 키-values를 키-value로 바꾸는 것이다. 즉,values 수조를 단일한 값value로 바꾸는 것이다.키-values의values 수조가 너무 크면 작은 키-values 블록으로 여러 개 나누어진 다음에 Reduce 함수를 실행하고 여러 블록의 결과를 새로운 수조로 조합하여 Reduce 함수의 두 번째 인자로 Reducer 작업을 계속합니다.만약에 우리가 초기의values가 매우 크다면 첫 번째 블록을 계산한 후에 구성된 집합에 대해 다시 Reduce가 나타날 수 있음을 예견할 수 있다.이것은 여러 단계의 병합 정렬과 유사하다.무게가 얼마나 될지는 데이터량에 달려 있다.
reduce는 반사 부분이든 이전의 간소화 부분이든 반복적으로 호출될 수 있어야 한다.그래서 Reduce가 되돌아오는 문서는 Reduce의 두 번째 매개 변수의 요소가 되어야 합니다.
(Map 함수를 쓸 때 emit의 두 번째 매개 변수 구성 수는 Reduce 함수의 두 번째 매개 변수를 구성하고 Reduce 함수의 반환 값은 emit 함수의 두 번째 매개 변수와 일치하며 여러 개의 Reduce 함수의 반환 값은 그룹을 구성하여 새로운 두 번째 입력 매개 변수로 Reduce 작업을 다시 수행할 수 있습니다.)
MapReduce 함수의 매개변수 목록은 다음과 같습니다.
 
  
db.runCommand(
 { mapreduce : ,
   map : ,
   reduce :
   [, query : ]
   [, sort : ]
   [, limit : ]
   [, out : ]
   [, keeptemp: ]
   [, finalize : ]
   [, scope : ]
   [, verbose : true]
 }
);

또는
 
  
db.collection.mapReduce(
                         ,
                         ,
                         {
                           ,
                           ,
                           ,
                           ,
                           ,
                           ,
                           ,
                           ,
                          
                         }
                       )

1.mapreduce:mapreduce 처리를 위한collection 2.map:map 함수 3.reduce:reduce 함수 4.out: 출력 결과의 collection 이름, 무작위 이름을 기본적으로 만드는 collection을 지정하지 않습니다. (out 옵션을 사용하면keeptemp:true를 지정할 필요가 없습니다. 이미 숨겨져 있기 때문입니다.)query: 조건이 충족된 문서만 맵 함수를 호출할 수 있는 선별 조건입니다.(query.limit,sort는 마음대로 조합할 수 있다)6.sort:limit과 결합된sort 정렬 매개 변수(map 함수에 보내기 전에 문서에 정렬하기도 함)는 그룹 구성 메커니즘을 최적화할 수 있다.limit: 맵 함수에 보내는 문서 수량의 상한선(limit이 없으면 단독으로sort를 사용하는 용도가 크지 않습니다)8.keytemp:true 또는false, 결과가 출력된collection이 임시인지 여부를 나타냅니다. 연결이 닫힌 후에도 이 집합을 보존하려면keeptemp를true로 지정해야 합니다. 만약mongoDB의mongo 클라이언트 연결을 사용한다면, exit를 사용해야만 삭제할 수 있습니다.스크립트가 실행되면, 스크립트가 종료되거나 close를 호출하면 자동으로 결과collection 9.finalize: 함수입니다. 맵,reduce를 실행한 후에 키와value를 한 번 계산하고 최종 결과를 되돌려줍니다. 이것은 처리 과정의 마지막 단계입니다. 따라서finalize는 계산 평균수입니다. 그룹을 잘라서 여분의 정보를 제거하는 적절한 시기입니다.scope:javascript 코드에 사용할 변수입니다. 여기에 정의된 변수는 맵,reduce,finalize 함수에서 11을 볼 수 있습니다.verbose: 디버깅에 사용할 자세한 출력 옵션입니다. MpaReduce의 실행 과정을 보려면true로 설정할 수 있습니다.맵, Reduce,finalize 과정 중의 정보를 서버 로그에 출력할 수도 있습니다.
MapReduce 함수를 실행하면 다음과 같은 문서 구조가 반환됩니다.
 
  
  { result : ,

    timeMillis : ,

    counts : {

               input : ,

               emit : ,

               output :

     } ,

     ok : <1_if_ok>,

     [, err : ]

}


1.result: 결과를 저장하는collection의 이름입니다. 이것은 임시 집합입니다.MapReduce의 연결이 닫히면 자동으로 삭제됩니다.2. timeMillis: 실행에 걸리는 시간, 밀리초 단위 3.input: 맵 함수에 보내는 조건의 문서 개수 4.emit: 맵 함수에서 emit가 호출된 횟수, 즉 모든 집합의 데이터 총량 5.ouput: 결과 집합 중의 문서 개수 (count는 디버깅에 매우 도움이 됩니다) 6.ok: 성공 여부, 성공 여부는 17.err:실패하면 여기에 실패 원인이 있을 수 있지만 경험적으로 보면 원인이 모호하고 작용이 크지 않다
java 코드에서 MapReduce를 실행하는 방법:
 
  
public void MapReduce() {
        Mongo mongo = new Mongo("localhost",27017);
        DB db = mongo.getDB("qimiguangdb");
        DBCollection coll = db.getCollection("collection1");
      
        String map = "function() { emit(this.name, {count:1});}";
                                                                                                             
  
        String reduce = "function(key, values) {"; 
        reduce=reduce+"var total = 0;"; 
        reduce=reduce+"for(var i=0;i         reduce=reduce+"return {count:total};}"; 
         
        String result = "resultCollection"; 
         
        MapReduceOutput mapReduceOutput = coll.mapReduce(map, 
                reduce.toString(), result, null); 
        DBCollection resultColl = mapReduceOutput.getOutputCollection(); 
        DBCursor cursor= resultColl.find(); 
        while (cursor.hasNext()) { 
            System.out.println(cursor.next()); 
        } 
    } 

좋은 웹페이지 즐겨찾기