Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

문서를 scoreing하고 정렬해서 TopN문서를 가져오는 검색엔진의 이론적인 기반은 5년전에 완성되었다. 게다가 문서를 효과적으로 수집해서 색인 테이블을 만드는 과정역시 별로 손볼 필요도 없을 정도의 경지에 이미 도달해있다.

문제는 이론이 아니고, 시스템이다. 하나의 시스템에서 소규모로 크롤링하고 색인 테이블 만들고 검색을 한다고 가정했을 때로 한정해 보자면, 구글검색엔진이나 lucene(:12)와 같은 검색엔진이나 국내의 다른 포털검색엔진이나 전혀 차이 없다고 보면 된다. 공개 검색엔진과 같은 경우 scoreing 하는 부분에서 비합리적인 부분이 몇군데 있긴 하지만, 이건 범용적으로 만들다 보니 그렇게 된거고, 문서 천만건을 기준으로 한다면, 코드 몇십줄 바꾸는 정도로해서 boolean 검색에 대해서 평균 0.5초 이내에 나오도록 할 수 있다. 여기에 몇가지 튜닝을 더한다면, 구글 부럽지 않은 속도로 결과를 가져올 수 있다.

그러나 문제는 문서의 "양"이다. 100만건을 색인한다고 했을 때, 환경에 따른 차이는 있겠지만 색인 데이터의 크기가 80-100Giga정도다. 1000만건이라면 Tera(:12)급이 될거다. Tera라.. 엄청난 크기이긴 하지만, 웹을 기반으로한 검색에 있어서 천만건으로 할 수 있는 일이란 없다. 국내용으로만 서비스한다고 해도, 최소한 1억건의 문서는 처리가능해야 한다. 1억건이면, 10Tera다.

게다가 해외 검색엔진과도 경쟁을 해야 할건데, 그럴경우 해외문서에 대한 수집도 염두에 두어야 한다. 이럴경우 처리해야 하는 문서는 최소 100억문서로 1000Tera다. 이쯤되면 문제는 전혀 달라진다. 80억건의 데이터를 하나의 시스템에 유지할 수도 없겠지만, 하나의 시스템으로 80억건의 문서를 어느 세월에 수집하고 파싱하고 분석해서 색인테이블을 만들것이며, 이 색인테이블 역시 1000Tera에 육박할 것인데, 어디에 저장할 것인가. 제대로된 검색환경의 구축을 위해서는 수만대의 시스템이 필요할 것이다. 이게 문제다. 저장공간도 그렇지만, 시스템관리, 백업관리, 오류관리... 보통 문제가 아니다.

1000Tera급의 데이터를 다룰 수 있는 시스템을 가졌기 때문에 구글이 세계최고가 된거다. 구글은 MapReduce(:12) 프로그래밍 모델과 응용을 개발해서, 수만대의 시스템에서 분산해서 데이터를 수집하고 분석할 수 있는 분산 컴퓨팅 환경을 만들었다.

물론 공개된 분산환경 시스템도 있다. nutch(:12)인데, Java로된 공개 소프트웨어 프로젝트로, apache 서브프로젝트로 추진되고 있다. 구글의 MapReduce 모델을 응용해서 분산 데이터 처리 환경과 분산 파일 시스템 환경도 제공하고 있다.

이런 이유로 검색엔진의 개발을 쉽게 생각하는 경향이 있는거 같다. 까짓거 리눅스 시스템 수천대 정도 구입해서, 공개 엔진 좀 수정해서 얹으면 되겠지 하는 생각인데, 오판이다.

nutch의 분산환경 특히, 분산파일 시스템은 구글의 그것에 비하면 걸음마 단계다. Google은 알려진 바대로 분산파일 시스템의 성능향상을 위해서 커널의 상당부분을 수정했다. 반면 nutch의 분산파일 시스템은 순전히 소프트웨어적으로 추상화된 계층을 하나더 얹는 것으로 파일시스템을 구축했다. 이 분산 파일시스템은 파일의 복사와 삭제, 읽기와 같은 일반적인 파일 작업을 하는데에는 전혀 문제가 없으나, 검색을 하는데에는 매우 매우 비효율적인 구조를 가지고 있다.

nutch의 분산파일 시스템인 hadoop을 가지고 테스트해본 결과 검색시간이 기본 초단위를 훌쩍 뛰어넘는다. boolean 쿼리라도 들어가면 100만건이 채 안되는 문서에서 십초단위를 우습게 넘나든다. 몇군데 요소를 최적화 한다고 하더라도, 검색엔진의 목표치인 0.5초는 Hadoop위에서는 불가능하다는게, 필자의 판단이다. hadoop을 쓰느니 차라리, 커널기반의 다른 글로벌파일 시스템을 테스트하거나, 로컬기반에서 검색을 하고 (단일 시스템에서는 결과가 잘나온다), 인덱스파일을 쪼개거나, 여러개의 세그먼트로 나누어서 분산검색을 하는 편이 나을거 같다.

hadoop이 얼마나 느린지는 직접 테스트해보길 바란다.
  1. 100Giga이상의 디스크 공간을 가진 시스템을 하나 준비한다.
  2. 백만건의 문서셋을 만든다.
    • 신문사가 되었든 어디가 되었든지간에, 문서수집하고 뻥튀기하면 된다.
  3. 뻥튀기 문서를 HTML 페이지로 만든다. 간단한 스크립트 만들어서 돌리면 된다.
  4. 그다음 뻥튀기 문서의 모든 링크를 포함하는 웹페이지 하나만들고,
  5. nutch를 이용해서 crawling 하면 된다.
  6. TIS 파일로부터 모든 Term을 얻어오는 프로그램을 하나 만든다.
  7. Term셋을 얻었다면, 수천개 정도의 Term을 셈플링하고, 각 Term에 대해서 검색결과를 출력한다. 검색결과는 <TF, Search Time> 으로 한다.
  8. 만들어진 데이터를 엑셀을 이용하던지, gnuplot를 이용하던지 해서 그래프로 그리면, 된다.