Nutch와 Hadoop을 활용한 분산 검색 시스템 구축

  1. Apache Nutch 아키텍처 개요 Nutch는 웹 스크래핑과 검색 엔진 기능을 제공하는 오픈소스 프레임워크로, 사용자가 자체적인 검색 인프라를 구현할 수 있도록 지원한다.

1.1 주요 컴포넌트 구성

  • WebDB: 수집된 페이지 정보 및 링크 관계 저장
  • Fetch Lists: WebDB의 대상 URL들을 그룹화하여 분산 처리용으로 나누기
  • Fetchers: Fetch List에 포함된 페이지를 다운로드하고, 결과로 상태 정보와 콘텐츠를 생성
  • Updates: 수집된 결과를 바탕으로 WebDB의 상태를 갱신
  • Content: 다운로드된 문서 본문 데이터
  • Indexers: 콘텐츠를 분석하여 색인 생성. 대규모 데이터 처리 시 분산 색인 생성 가능
  • Searchers: 사용자 질의를 처리하며, 결과를 캐시해 성능 향상
  • Webservers: HTTP 요청을 수신하고, 검색 결과를 반환하는 역할 수행

이러한 구성은 반복적으로 작동하며 최신 웹 컨텐츠를 유지한다. 특히, Fetchers와 Searchers는 하둡 환경에서 분산 실행이 가능하다. 색인 생성 및 검색 기능은 Solr 프레임워크를 통해 구현할 수 있다.

1.2 데이터 저장 구조 Nutch는 세 가지 핵심 디렉터리로 데이터를 관리한다:

  • Crawldb: 수집 대상 URL 목록과 각각의 상태(수집 여부, 시간 등)를 저장
  • Linkdb: 각 페이지 내 포함된 하이퍼링크 정보(아크 태그 포함)를 저장
  • Segments: 하나의 수집 작업 단위로, 분산 처리에 적합한 일괄 집합

각 Segment에는 다음과 같은 하위 폴더가 포함된다:

  • crawl_generate: 다음 수집 대상이 되는 URL 목록 (SequenceFile 형식)
  • crawl_fetch: 각 URL의 수집 상태 (MapFile 형식)
  • content: 다운로드된 이진 데이터 (MapFile 형식)
  • parse_text: 추출된 텍스트 내용 (MapFile 형식)
  • parse_data: 메타데이터 정보 (MapFile 형식)
  • crawl_parse: Crawldb의 상태를 실시간으로 업데이트 (SequenceFile 형식)

여기서 Crawldb는 WebDB와 동일한 역할을 하며, Segment는 Fetch Lists와 유사한 개념이다. 분산 수집 과정에서 각 MapReduce 작업은 고유한 시간 이름을 가진 Segment를 생성한다.

  1. Apache Hadoop 기반 분산 처리 단일 머신에서 실행하는 Nutch는 제한된 규모에 적합하지만, 대량의 웹 데이터를 수집하려면 분산 환경이 필수적이다. 이를 위해 Nutch는 하둡 환경과 통합되어 분산 수집 및 검색이 가능하다.

2.1 MapReduce 처리 흐름

  1. 입력 파일을 16~64MB 크기의 블록으로 분할하고, 마스터 노드에서 작업을 배치 시작
  2. 마스터/슬레이브 구조로 동작. 마스터는 작업 스케줄링 및 상태 모니터링 담당
  3. 슬레이브(워커)는 입력 블록을 읽어 키-값 쌍을 추출 후 사용자 정의 Map 함수에 전달
  4. Map 함수의 출력은 메모리 버퍼에 임시 저장됨
  5. 버퍼는 주기적으로 로컬 디스크에 기록되며, 위치 정보는 마스터에 전송
  6. Reduce 작업 수행 시, 마스터는 관련 Map 출력 위치를 워커에게 전달
  7. 워커는 원격 데이터를 가져와 동일한 키를 가진 항목을 정렬
  8. 정렬된 데이터는 사용자 정의 Reduce 함수에 전달되고, 최종 결과는 출력 파일에 저장
  9. 모든 작업 종료 후 마스터는 사용자 프로그램을 재개함

2.2 HDFS 아키텍처

  • NameNode: 마스터 역할. 파일 시스템의 이름 공간과 접근 권한을 관리
  • DataNode: 슬레이브 역할. 실제 데이터 블록을 저장. 일반적으로 한 머신당 하나의 DataNode 운영
  • Heartbeat: DataNode가 정기적으로 상태를 보고하여 장애 감지
  • BlockReport: 저장된 블록 목록을 마스터에 전달

2.3 참고 자료

  1. 환경 설정 절차

3.1 사전 준비

  • 두 대 이상의 리눅스 머신 (예: master, slave01)
  • 동일한 사용자 계정 (nutch)으로 접속 가능하도록 설정
  • /etc/hosts 파일에 호스트 이름 매핑 추가:
192.168.7.11 master
192.168.7.12 slave01

3.2 SSH 연결 설정

# master 머신에서 키 생성
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

# 다른 머신에 키 복사
scp ~/.ssh/authorized_keys nutch@slave01:/home/nutch/.ssh/

이후 master에서 slave01로 비밀번호 없이 접속 가능.

3.3 Hadoop 구성 $HADOOP_HOME/conf 디렉터리 아래 설정 파일 수정:

  • hadoop-env.sh
export HADOOP_HOME=/opt/hadoop
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64
export HADOOP_LOG_DIR=${HADOOP_HOME}/logs
  • core-site.xml
<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://master:9000</value>
  </property>
</configuration>
  • hdfs-site.xml
<configuration>
  <property>
    <name>dfs.name.dir</name>
    <value>/nutch/data/name</value>
  </property>
  <property>
    <name>dfs.data.dir</name>
    <value>/nutch/data/data</value>
  </property>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>
  • mapred-site.xml
<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>master:9001</value>
  </property>
  <property>
    <name>mapred.map.tasks</name>
    <value>2</value>
  </property>
  <property>
    <name>mapred.reduce.tasks</name>
    <value>2</value>
  </property>
  <property>
    <name>mapred.system.dir</name>
    <value>/nutch/data/mapreduce/system</value>
  </property>
  <property>
    <name>mapred.local.dir</name>
    <value>/nutch/data/mapreduce/local</value>
  </property>
</configuration>
  • masters, slaves 파일 작성
master
slave01

3.4 Nutch 설정 $NUTCH_HOME/conf 디렉터리 내 설정:

  • nutch-site.xml
<property>
  <name>http.agent.name</name>
  <value>Nutch Spider</value>
</property>
  • regex-urlfilter.txt
+^http://([a-z0-9]*\.)*nutch.apache.org/
  • 설정 파일을 $NUTCH_HOME/runtime/deploy/nutch-*.job 경로에 복사
  1. 시스템 실행

4.1 Hadoop 시작

# NameNode 포맷
bin/hadoop namenode -format

# 전체 서비스 시작
bin/start-all.sh

# 확인용 웹 인터페이스
- NameNode: http://master:50070
- JobTracker: http://master:50030

# 테스트 데이터 입력
bin/hadoop fs -put conf input

# 예제 작업 실행
bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'

# 종료
bin/stop-all.sh

4.2 Nutch 실행

  1. Hadoop이 정상 실행 중인지 확인
  2. HADOOP_HOME/bin을 PATH에 추가
  3. JAVA_HOME 환경 변수 설정
  4. 수집 대상 데이터를 HDFS에 업로드
bin/hadoop fs -put urldir urldir

(첫 번째 urldir는 로컬 파일 경로, 각 줄마다 하나의 URL 포함)

  1. Nutch 실행 (deploy 디렉터리에서 실행)
bin/nutch crawl urldir -dir crawl -depth 3 -topN 10

실행 완료 시, HDFS에 crawl 디렉터리가 생성됨. 반드시 deploy 폴더에서 실행해야 하며, local 폴더에서는 분산 처리가 불가능하다.

태그: Apache Nutch Apache Hadoop MapReduce HDFS Distributed Crawling

9월 24일 22:34에 게시됨