SPADE 기반 대용량 데이터 마이닝

이번 글에서는 SK플래닛에서 개발/운영 중인 대용량 데이터 마이닝 플랫폼에 대해서 말씀드리겠습니다. SPADE(스페이드)라고 불리는 이 플랫폼은 현재 여러가지 SK 플래닛의 서비스 및 데이터 분석에 사용되고 있는데요, 먼저 SPADE가 등장하게 된 배경에 대해 살펴본 후에, SPADE에 대해 말씀드리겠습니다.

데이터 마이닝과 추천(Data Mining and Recommendation)
위키피디아에 데이터 마이닝은 “Data mining is the process that results in the discovery of new patterns in large data sets.”, 즉 ‘대규모 자료에서 새로운 패턴을 찾아내는 과정’이라고 정의되어 있습니다. 이러한 데이터 마이닝에는 평균, 분산과 같은 통상적인 통계부터 인공지능, 기계학습에서 사용되는 복잡한 알고리즘이 사용되기도 합니다. 그런데 인터넷이 발전하면서 주목 받기 시작한 분야가 바로 추천(Recommendation) 혹은 개인화(Personalization)라고 불리는 영역입니다. 추천 기술이 가장 성공적으로 사용되고, 가장 널리 알려진 서비스 중의 하나인 Amazon에 가보시면 특정 상품을 클릭했을 때 아래와 같은 화면을 볼 수 있습니다.

즉 ‘이 책을 산 사람들이 많이 산’ 다른 책들을 보여줘서, 고객의 관심 분야에서 다른 책을 보다 쉽게 찾아볼 수 있게 해주고 있습니다. 요즘은 국내 인터넷 서점이나, 인터넷 쇼핑몰에서도 유사한 기능을 심심치 않게 볼 수 있습니다. 인터넷에는 너무 많은 정보가 있기 때문에 고객이 일일이 검색하지 않고도 원하는 결과에 조금 더 손쉽게 다가갈 수 있도록 하는 노력의 일환으로도 볼 수 있습니다.

대용량 데이터의 저주 혹은 ?

위와 같은 기능은 연관 규칙 마이닝(Association Rule Mining)이나 협업 필터링(Collaborative Filtering)이라고 불리는 영역의 다양한 알고리즘을 이용해서 제공할 수 있습니다. 이런 알고리즘은 인터넷이 이렇게 발전하기 이전부터 사용되어 왔습니다.

그런데 인터넷이 발전하고, 스마트 기기의 사용량이 늘면서 분석해야할 데이터가 너무 많아진다는 점이 문제가 되기 시작합니다. 고객 편의성을 위해 앞에서 언급한 기술들을 적용해야 하는데, 데이터가 많아지면서 결과를 만드는데 시간이 너무 걸린다든지, 저장 공간과 메모리 때문에 기존의 컴퓨터로는 돌릴 수 없다든지 등의 이유로 기존의 데이터베이스나 데이터마이닝 도구를 사용할 수 없는 경우가 종종 발생하게 된 것입니다.

조금만 더 자세하게 알아볼까요?

추천에서 흔히 사용되는 연관 규칙 마이닝에는 A priori 알고리즘이나 Frequent Pattern Growth라는 대표적인 알고리즘이 있는데, 쉬운 설명을 위해 다른 요소들을 배제하면, 분석 시간을 결정짓는 중요한 두가지 요소를 1) 고객수와 2) 고객이 실제 구매(클릭)한 물건(아이템) 수로 한정 지을 수 있습니다. 앞에서 언급한 Amazon과 같이 ‘이 물건을 산 다른 고객들이 산 물건’을 만들어 내려면, 고객별 구매이력에서 최소한 2개짜리 조합(combination)을 계산해야 하는데요, 고객별 평균 50개의 아이템을 클릭했다면, 대략 1200번의 연산을 고객수 만큼 해야 하고, 전체 아이템의 개수가 N개라고 하면 N의 제곱의 반개 정도 생기는 연관 규칙의 통계값을 모아주고 연산해야 합니다. (서로 다른 n개에서 2개를 뽑는 경우의 조합의 수는 nC2는 n(n-1)/2 입니다.)

협업 필터링(CF)의 경우에도, 유사한 사용자를 찾기 위해 사용자간의 유사도를 계산하는데, 사용자의 수가 M명일때 M 제곱만큼의(정확하게는 M(M-1)/2 번) 유사도 계산이 필요합니다. 2011년에 T store의 고객은 벌써 1000만명이 넘었는데, 1000만의 제곱이라고 하면 어느 정도일까요? 1초에 100만번 유사도 계산을 하는 경우에도 대략 1년 반이 넘게 걸립니다. 데이터 마이닝의 기본 도구 중 하나인 k 평균 군집 분석(k-means clustering)의 경우에도 군집의 개수를 k개라고 하면, k개 군집의 중심과 나머지 모든 데이터와의 거리를 계산하는데, 데이터의 차원이 커지고 데이터의 개수가 많아지면 점점 기존의 시스템이나 데이터 분석 도구로 계산하는데 시간도 많이 걸리고 실행 자체가 어려워집니다.

물론 효율적인 구조 설계나 색다른 방식으로 위의 문제들을 비껴나갈 수 있습니다. 그런데 문제는 시간입니다. 오늘까지 데이터를 분석해라고 했는데, 기존 방식으로는 한달이나 두달 뒤에 그 결과를 받아 보게 되는 경우도 생기지 말란 법이 없습니다.

MapReduce!

그런데 이런 고민을 가장 심각하게 하던 곳이 있었습니다. 바로 구글(Google)입니다. 구글은 검색 서비스를 위해 분석을 해야 되는 데이터도, 그리고 전세계의 사용자가 만들어 내는 데이터도 엄청나게 많습니다. 이렇게 방대한 데이터를 처리하기 위해 구글은 구글 파일 시스템(Google File System)이나 MapReduce(맵리듀스) 같은 개념을 기술로 발전시켰습니다. 방대한 양의 데이터를 수십 대에서 수백, 수천 대의 컴퓨터에 나누어 저장하고, 각 컴퓨터에 분산된 데이터 각각에 대한 처리/분석을 수행하여 전체 결과를 얻는 구조가 그 핵심이라고 설명할 수 있습니다.(MapReduce 소개는 위키피디아의 글이나, Yahoo의 튜토리얼를 참조하십시오. 또한 MapReduce 기반의 각종 알고리즘 관련 논문은 이 블로그에서 확인하실 수 있습니다.)

MapReduce 기반 마이닝 알고리즘 개발

SK 플래닛에서도 2009년부터 하둡(Hadoop은 대용량 데이터를 분산 환경에서 처리하는데 필요한 프레임웍이나 도구를 제공하는 오픈 소스 프로젝트입니다.)을 이용해서 MapReduce 기반으로 연관 규칙 마이닝을 비롯하여, 여러가지 협업 필터링 알고리즘, 키워드 분석이나 군집 분석, 통계 기능 및 이런 알고리즘을 실 서비스에 적용하기 위해 필요한 각종 전/후 처리 모듈을 개발하였습니다.

기존의 방식과는 조금 다르게, MapReduce에서는 모든 데이터나 분석의 단위가 키(key)와 밸류(value)라는 2개의 데이터 구조의 조합으로 이루어진다고 얘기할 수 있습니다. 분산된 컴퓨터 간에 이런 키와 밸류를 순차적이나 병렬적으로 주고 받아 원하는 결과를 얻어낼 수 있기 때문에, 특정 알고리즘을 MapReduce 구조에 맞게 변경하기 위해서는, 목적 알고리즘을 분석하여 키와 밸류를 잘 설계하는 것이 그 첫단계라고 할 수 있으며, 알고리즘에 따라 k-평균 군집 분석과 같이 MapReduce 프레임웍과 아주 잘 어울리는 것이 있고, 무리하게 MapReduce에 맞게 변경하려고 하면 오히려 더 효율성이 떨어지는 경우도 있기 때문에 목적 알고리즘과 그 알고리즘을 사용하려는 목표에 맞게 잘 선택해서 디자인 해야 합니다.

그리고 MapReduce 기반으로 데이터 처리 알고리즘을 개발할 때 중요한 것 중 하나가 바로 확장성(scalability)을 보장하는 것인데요, 데이터가 작거나 연결된 컴퓨터 개수가 작을 때는 잘 실행되는 것 같다가 데이터가 많아지거나 컴퓨터를 많이 연결하면 전혀 예상치 못한 곳에서 오류가 발생하거나 원하는 속도가 나오지 않는 경우가 종종 있습니다. 특히 단순한 데이터 처리가 아닌 연관 규칙 마이닝과 같은 다소 복잡한 알고리즘을 MapReduce로 변경할 때 이런 경우가 발생할 수 있는데 이를 미연에 방지하기 위해서는 분산된 컴퓨터 간 주고 받는 키와 밸류를 어떻게 효율적으로 설계할 것인지, 각 분산된 컴퓨터의 개별 연산을 어떻게 감소시킬 것인지, 네트워크 트래픽의 병목을 발생시킬 소지는 없는지 등등을 고려하여 개발하여야 합니다. 이를 위해 도입 초기 주요 알고리즘에 대해서는 컴퓨터의 대수와 데이터 크기를 변경해 가며 실행 속도가 선형 비례로 줄어들거나 늘어나는지를 일일이 확인하였습니다.

이런 노력의 결과를 직접 확인할 기회도 있었습니다. 개발된 몇가지 알고리즘이 티스토어에 사용되고 있었습니다. 그런데 작년 여름을 전후로 해서 티스토어의 사용량이 증가해면서 기존에 할당해 놓은 컴퓨터 대수로는 원하는 시간 내에 계산하기가 점점 어려워지기 시작했습니다. 하지만, 알고리즘이나 로직에 대한 수정이나 개발 없이 컴퓨터를 더 추가하는 것으로 문제를 해결했습니다. 실제 서비스를 통해 scalability의 진가를 확인할 수 있었던 경험이었습니다.

대용량 데이터 마이닝 플랫폼 SPADE

지금까지 대용량 데이터 분석 관점에서 마이닝 알고리즘을 어떻게 개발하는지 간단히 설명하였습니다. 그런데 이렇게 개발된 알고리즘이나 MapReduce 기반 기능들은 관련 지식이 없는 경우에 사용하기가 어려웠습니다. 데이터가 클 때에는 단순히 평균과 같은 통계값을 Hadoop 환경에서 MapReduce로 구하는 것도 장애물이 될 수 있습니다.

그래서 대용량 데이터 처리에 필요한 기능을 편리하게 수행할 수 있도록 SPADE가 만들어졌습니다. SPADE는 대용량 데이터 처리 작업을 알고리즘 전문가나 데이터 마이닝 전문가가 아니더라도 손쉽게 수행할 수 있게 만든 일종의 웹 기반 어플리케이션입니다. 대용량 데이터를 처리할 때 데이터에 대한 지식만 가지고도 여러가지 기능들을 적용해 볼 수 있도록 SPADE는 데이터 마이닝에 필요한 기능을 각각 개별 모듈로 만들고 이런 모듈을 손쉽게 연결해서 사용할 수 있는 구조를 제공합니다. 이를 위해 각각의 모듈은 최대한 타 모듈이나 입력 형태에 대한 의존도가 낮고, 재활용성이 높도록 설계되어야 합니다.

이렇게 만들어진 모듈의 예를 한번 보겠습니다. SPADE를 이용하여 군집 분석을 하고자 하는 경우 아래의 왼쪽 그림처럼 데이터를 읽어들이는 모듈과 k-평균 군집을 수행하는 2개의 모듈을 연결하기만 하면 모든 준비가 끝납니다. 앞서 얘기한 연관 규칙 마이닝의 경우에도, 아래의 오른쪽 그림에서처럼 4개의 모듈(데이터 입력 모듈, 각 사용자별 아이템 정렬 모듈, 연관 규칙 생성 모듈, 데이터 출력 모듈)을 연결하기만 하면 됩니다.

자 그럼 조금 더 구체적으로, SPADE는 어떤 요소들로 구성되어 있는지 자세하게 살펴보겠습니다.

SPADE는 크게 4가지 부분으로 구성됩니다.

  • 마이닝 프로세스 엔진
    • 눈에는 보이지 않지만 가장 중요한 기능을 하는 부분입니다. 사용자가 드래그 앤 드롭으로 쓱싹쓱싹 연결한 모듈이 Hadoop 환경에서 돌아가게 해주는 부분입니다.
  • 마이닝 프로세스 디자이너
    • 여러가지 모듈들을 드래그 앤 드롭으로 연결하고 조작할 수 있는 GUI를 제공합니다. 아래 그림처럼 왼쪽의 모듈 저장소에서 필요한 기능들을 선택해서 드래그 앤 드롭한다음, 순서대로 연결해주고 필요한 파라메터 값들을 손쉽게 설정해서 사용할 수 있도록 되어 있습니다.
  • 모듈 저장소
    • 앞에서 얘기한 알고리즘과 같이 개별의 기능을 가지는 하나하나의 모듈을 불러 쓸 수 있는 곳입니다. 현재 SPADE에는 약 30개의 일반 목적에 필요한 모듈과, 특정 알고리즘과 서비스에 필요한 모듈이 40여개 정도 구비되어 있습니다. 주요 목적별로 간단하게 나누어 보면 데이터 입/출력에 필요한 Import/Export 모듈, DB에서 흔히 쓰이는 Join이나 Select 부터 각종 Filter등을 수행하는 ETL/Summary 모듈, 군집 분석이나 추천 등의 각종 알고리즘 모듈, 그리고 최근에는 PigHive와 같은 기능을 SPADE에서 사용할 수 있는 모듈도 추가되고 있습니다.
  • 통합 모니터링 화면
    • 사용자가 각 모듈을 연결해서 만들어 놓은 하나의 기능을 프로세스라고 부르는데요, 이러한 여러 개의 프로세스들이 잘 실행되고 있는지, 전체 시스템은 잘 동작하고 있는지를 한 눈에 확인할 수 있는 화면입니다.

<SPADE의 마이닝 프로세스 디자이너>

지금 SPADE는

현재 SPADE는 SK 플래닛의 여러 서비스에 필요한 분석이나 서비스 기능 제공을 위해 불철주야 데이터를 분석하고 있습니다. 가장 친근하게는 티스토어(T store)나 호핀(hoppin)에서의 추천 및 개인화에 필요한 데이터 분석을 수행하거나, 앱 추천 앱이라고 할 수 있는 앱머써, 고객의 취향에 따라 스마트폰에서 모바일 웹 사이트를 추천해주는 기능을 탑재한 빙고(Vingo)와 같은 앱에 필요한 기능들을 제공하고 있습니다. 또한 내부적으로는 새로운 기술이나 대용량 데이터 분석 알고리즘 개발 등이 필요한 경우에도 사용되고 있습니다.

조금씩 SPADE가 사용되는 영역과, 사용하려는 목적이 많아지면서, 기존에는 예상할 수 없었던 새로운 이슈들이 생기곤 합니다. 사용자가 손쉽게 사용할 수 있도록 파라메터를 정형화 하고 최대한 재활용성이 높아지도록 모듈을 단위화 해서 개발하는 것은 생각보다 쉬운 일이 아니어서, 문서상 요구되는 기능은 아주 조금 다를 뿐인데, 실제로는 새로운 모듈을 개발해서 넣어야 한다거나 하는 이슈들도 발생합니다. 하지만 이런 시행착오와 수정을 통해 결과적으로는 사용자의 요구를 더 잘 수용할 수 있고 더 사용하기 쉬운 SPADE로 발전시키기 위해 노력중입니다.

마치며
이상으로 SK 플래닛의 대용량 데이터 마이닝 플랫폼인 SPADE에 대해 살펴 보았습니다. 지금은 저희가 처음 MapReduce로 각종 알고리즘을 개발하고 테스트하던 2009년에 비해 Hadoop이나 MapReduce에 대해서도 많이 알려져 있고, Mahout과 같이 MapReduce기반으로 다양한 알고리즘을 개발하여 공개한 오픈 소스도 조금씩 많아지고 있는데요, 다음 포스팅에서는 개별 서비스나, 서비스에 필요한 알고리즘에 어떠한 기술들이 사용되고 어떻게 MapReduce 기반으로 개발되었는지 등에 대해 살펴보겠습니다.

읽어주셔서 감사합니다.
참. 혹시 궁금해하셨던 분이 계셨는지 모르겠네요. SPADE는 Scalable & Parallel Analyzer for Data Enrichment의 약어입니다 🙂

김민성 Data platform팀

현재 SK 플래닛에서 빅 데이터 분석 및 추천에 필요한 대용량 알고리즘 개발을 담당하고 있습니다.

공유하기