C# 프로그래밍 기초 실습 전자책
마이크로소프트의 빅데이타 COSMOS

[제목] 마이크로소프트의 빅데이타 COSMOS

Summary: 마이크로소프트의 빅데이타인 COSMOS 시스템에 대한 간략한 소개


얼마전 빅데이타와 관련하여 Mark Russinovich가 리트윗한 재미있는 Screen Shot 하나를 접하게 되었다. 우스갯 소리 같은 이 글은 빅데이타에 대한 현재의 상황를 잘 표현하고 있는지도 모른다. 누구나 빅데이타를 얘기하지만, 실제 어떻게 시스템이 돌아가는지에 대한 정보가 많은 것도 아니다...


빅데이타는 기존 컴퓨터 시스템으로는 처리 불가능한 엄청난 양의 정형, 비정형 데이터를 수집, 저장하고 이를 분석, 처리하는 기술을 의미한다. 빅데이타에 대한 구체적 구현 자료가 아직 많지 않은데, 이 아티클에서는 마이크로소프트의 빅데이타 사례를 한 예로 간략히 정리해 보고자 한다.

마이크로소프트는 COSMOS라 불리우는 내부 빅데이타 시스템을 구축하고 있다. COSMOS는 Bing에서 개발되어 MS 전사적으로 쓰이고 있는데, 주로 Bing, Ads, MSN, Windows Live 등에서 사용된다. COSMOS는 수백 Peta Byte에 해당하는 대용량 데이타를 저장하고 있으며, 웹 인덱스, 웹 트래픽 로그, 클릭 스트림, 피드 데이타 등 다양한 종류의 데이타를 저장하고 있다. 이러한 대용량 데이타는 다시 검색엔진 개발, 마케팅 및 다양한 비지니스 분석 등에 활용되고 있다.

이렇게 엄청난 양의 데이타를 빠른 시간 내에 처리하기 위해서는 몇 대의 고성능(?) 컴퓨터만으로는 불가능하다. 이러한 빅데이타를 처리하기 위해서 COSMOS는 수 만대의 컴퓨터가 병렬처리를 진행하는 Dryad라 불리우는 Computation 플랫폼을 구축하고 있다. MS Research에서 개발된 Dryad는 구글의 Map-Reduce 혹은 요즘 가장 인기를 끌고 있는 Hadoop과 비슷한 시스템으로 볼 수 있다. 개념적으로 COSMOS는 대용량의 빅데이타와 이를 처리하기 위한 병렬 처리 플랫폼이 결합된 시스템으로 이해될 수 있다.

COSMOS는 물리적으로 어디에 존재하는가?
COSMOS는 여러 Microsoft Data Center 내에 약 10만대(추정치)의 컴퓨터가 병렬 처리를 진행할 수 있도록 구성되어 있다. 빅데이타의 데이타는 연일 계속 증가 추세에 있으므로, 시스템의 증가는 매우 가변적이라 볼 수 있다. 데이타센터는 미국을 비롯해 전세계적으로 분산되어 존재하는데, 다음 사진은 미국의 유명한 MS 데이타센터인 시카고 데이타센터를 보여주고 있다. 시카고 데이타센터는 대량의 컴퓨터들을 특수 에어컨 장비를 갖춘 컨테이너들에 넣어 모듈화하여 관리하는 기법을 사용하고 있다.


COSMOS의 데이타는 Stream이라는 COSMOS Storage Layer에 존재하는 파일에 저장되는데, 하나의 Stream은 복수의 Extent들로 구성되며 하나의 Extent는 최대 2GB 까지 확장될 수 있다. Extent를 처리하는 Extent Node (컴퓨터)는 복수의 Extent들을 가지고 있으며, 한 Extent는 3개의 서로 다른 Extent Node들에 복제되어 저장된다. 이것은 하나의 노드가 문제가 생겨도 다른 2개의 복제본을 갖기 위함이다.

그러면, COSMOS는 어떻게 데이타를 읽고 쓰는가? 예를 들어, 가장 일반적인 데이타 형태인 로그 데이타를 읽고 쓰는 시나리오를 생각해 보자. 웹 로그를 쓸 때는 파일을 Append Only 모드로 열고, 계속 새 데이타를 추가만 하게 된다. 즉, 파일 중간을 찾아 삽입하거나 특정 레코드를 갱신하거나 혹은 삭제하는 일을 하지 않는다. 로그 데이타는 전세계에서 매순간마다 계속 추가 되므로 많은 컴퓨터들이 병렬로 데이타 추가 작업을 진행한다. 추가 작업을 진행하면서도 동시에 다른 프로세스가 해당 파일을 읽는 작업을 허용한다. 이를 C#에서 개념적으로 표현해 보면 다음과 같이 파일을 Append 모드로 오픈하고 R/W로 공유하는 모양이 될 것이다.

FileStream fs = File.Open(@"a.log", FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
로그 데이타를 읽을 때는 다수의 컴퓨터에서 병렬로 분산된 로그 파일들을 Read 모드로 읽게 되며, 동시에 다른 컴퓨터들 혹은 프로세스들의 읽거나 쓰는 동작을 허용하게 된다. COSMOS의 Compuation Platform은 이렇게 병렬로 처리된 데이타들을 다시 병합을 통해 최종 출력 데이타를 생성하게 된다. 마찬가지로 이를 C#에서 개념적으로 표현해 보면 다음과 같이 파일을 Read 모드로하고 공유하는 모양이 될 것이다.
FileStream fs = File.Open(@"a.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);


이러한 Low Level의 데이타 처리를 바탕으로, COSMOS는 보다 High Level에서 빅데이타를 쉽게 분석/처리하기 위하여, SCOPE (Structured Computations Optimized for Parallel Execution) 라는 쿼리 언어를 제공한다. 이 SCOPE는 SQL문과 비슷한 문법을 사용하는데, 필요하다면 C#으로 확장 함수를 만들어 SCOPE에서 함께 사용할 수 있다. SCOPE는 빅데이타에서 데이타를 불러와서 가공하고 분석/처리하는 매우 강력한 쿼리언어이다. SCOPE의 개발 툴은 Visual Studio에 플러그인을 제공하므로 VS 안에서 코딩 및 실행을 함께 할 수 있다. 

아래 SCOPE 예제는 sample.log 라는 입력 파일을 Default Extractor를 사용하여 읽어 들여 몇 개의 컬럼 데이타를 뽑아 sample.out 에 출력하는 코드이다. 중간의 MyFunc()는 C# 으로 작성된 사용자 함수이고, Extractor는 여기서는 디폴트를 사용했지만 데이타 포맷에 따라 다양하게 C#으로 정의하여 사용할 수 있다. 

   SELECT Query, MyFunc(val) AS Value
   FROM "sample.log"
   USING DefaultTextExtractor;

   OUTPUT TO "sample.out";

위의 SCOPE 코드는 SCOPE Compiler와 Optimizer를 거쳐 실행코드가 SCOPE Executor로 넘겨져 복수의 컴퓨터에서 병렬로 실행되게 된다. 물론 하나의 파일명(sample.log)이지만, 실제로는 데이타는 복수의 Extent들에 분산되어 저장되어 있으므로, 대용량 데이타를 병렬로 집계하는 과정을 Backend에서 거치게 된다.

* 무단 전재를 금합니다.



본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.