-
MapReduceDatabase/MongoDB 2023. 2. 2. 22:30
대용량 데이터의 분산처리를 위해 개발된 기술로 맵 형식으로 데이터를 산출하는 기능입니다.
몽고디비의 맵리듀스는 자바스크립트 언어의 문법을 사용하여 구현하며, 분산처리는 단일프로세스 내의 멀티 쓰레드 방식으로 동작합니다. ( SpiderMonkey Engine )
예시
- query 를 통해 가져올 데이터의 조건을 지정
- out 을 통해 출력될 collection(order_totals) 을 생성 및 출력 저장
- 첫번째 Parameter 의 JS Function 을 통해 collection 을 map 형식으로 치환
- 두번째 Parameter 의 JS Function 을 통해 합산 처리
인자
> db.collection.mapReduce( <map> ,<reduce> { out: <collection> ,query:<document> ,sort:<document> ,limit:<number> ,finalize:<function> ,scope:<document> ,jsMode:<boolean> ,verbose:<boolean> } )
Option Description out 출력 결과를 표기할 곳을 지정 query collection 의 검색조건 (find와 동일하게 구성가능) sort 인덱스를 이용한 정렬에 활용 limit document 수량 제한 finalize reduce 이후 동작 지정 scope Global 변수 설정 (map, reduce 의 JS Function에서 활용) jsMode 메모리에 데이터를 적재하여 도출 속도의 가속을 지정 (default : false, document max : 500000 ) verbose 단계별 처리과정 및 소요시간에 대한 정보 명시 여부 (default : true) 특징
C/C++ 에서 Map을 멀티쓰레드에서 활용할때, Mutex 를 통한 Lock 을 하는 것과 마찬가지로 Mapreduce 을 통한 처리를 하는 중은 Lock 이 걸립니다.
만약 Mapreduce 를 통한 처리량이 엄청 클 경우 처리에 시간되는 긴 시간동안 Lock 이 걸립니다.
MongoDB 에서는 nonAtomic : true 를 통해 분기별 Lock 해제를 설정해야 긴 처리시 Lock 에 물려서 지연되지 않습니다. nonAtomic 의 기본값은 false 입니다.
기본적으로 mapreduce 에서 Lock 이 걸리는 케이스
- Document 의 읽기 동작시 Read Lock 이 설정되며, 100개 단위로 잠금을 해제합니다.
- 임시 Collection 에 삽입하면 Write Lock 이 설정됩니다.
- 출력 Collection 이 존재하지 않으면, 출력 콜렉션 작성에 Write Lock 이 사용됩니다.
- 출력 Collection 이 존재하면, 출력과 연관된 기능 (merge, replace, reduce)이 Write Lock 이 설정되며 모든 인스턴스 전역에 작업을 차단합니다.