본문 바로가기
데이터과학/데이터 분석 실습

맥미니 몽고디비 분산 시스템 (5) - Aggregate

by 경성현 2013. 7. 20.

1. Sharding을 위한 Shard key 생성

Sharding을 위해서는 Shard Key를 생성해야 하며, 생성된 Shard Key에는 반드시 인덱스의 생성이 요구됩니다.

$ mongo 192.168.3.2:27017/admin
mongos>
mongos> db.runCommand( {enablesharding : "test"} )  // test db 의 Shard 기능 활성화 
mongos>
mongos> use test
mongos> db.things.ensureIndex( {empno : 1} )  // empno 항목에 대한 오름차순 색인 생성 
mongos>
mongos> use admin
mongos> db.runCommand( {shardcollection : "test.things", key : {empno : 1}} )


2. 테스트 데이터 입력

mongos의 test db에 접속해서 50,000,000건의 pseudo 데이터를 입력하고, 입력된 데이터로부터 aggregate()을 해보겠습니다. 입력하고자 하는 pseudo 데이터는 회사의 고용자들에 대한 정보로서 사원번호, 소속 부서의 번호(0~100까지), 그리고 데이터가 입력된 시간 정보를 포함하고 있습니다. 소속 부서의 번호는 무작위Random 방법 으로 0부터 100까지의 숫자가 할당되며, 데이터가 입력된 후에는 소속 부서별로 몇 명의 인원 이 할당되어 있는지 Map-Reduce 방법을 통해서 계산하는 예제도 시현해 보려고 합니다. 현재의 시 스템 구성에서 데이터를 입력하는데 약 90분 정도 소요되며, 입력된 데이터의 크기는 약 20GB 물리적 공간을 차지합니다.

$ mongo 192.168.3.2:27017/test ← test db에 접속한다 mongos>
mongos> for (var n=10000000; n<60000000; n++) {
                         var deptno = Math.round(Math.random()*100);
                         var added_at = new Date();
                         db.things.insert( {"empno": n, "deptno": deptno, "added_at": added_at} )
              }


3. aggregate() 메써드를 통한 Map-Reduce

MongoDB 2.1.2 이상 버전에서는 내장되어 있는 mapReduce() 메써드 이외에도 aggregate() 메써드를 통해서도 Map-Reduce를 시행할 수 있습니다. 50,000,000건의 데이터에서 소속 부서별로 인 원수를 집계하는 Map-Reduce 계산은 aggregate() 메써드를 이용하면 수분 이면 충분합니다.

$ mongo 192.168.3.2:27017/test   // test db에 접속한다
mongos>
mongos> db.things.aggregate( {$group : {_id : "$deptno", total : {"$sum":1}}} )