- 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를 생성한다.
- Apache Hadoop 기반 분산 처리 단일 머신에서 실행하는 Nutch는 제한된 규모에 적합하지만, 대량의 웹 데이터를 수집하려면 분산 환경이 필수적이다. 이를 위해 Nutch는 하둡 환경과 통합되어 분산 수집 및 검색이 가능하다.
2.1 MapReduce 처리 흐름
- 입력 파일을 16~64MB 크기의 블록으로 분할하고, 마스터 노드에서 작업을 배치 시작
- 마스터/슬레이브 구조로 동작. 마스터는 작업 스케줄링 및 상태 모니터링 담당
- 슬레이브(워커)는 입력 블록을 읽어 키-값 쌍을 추출 후 사용자 정의
Map함수에 전달 Map함수의 출력은 메모리 버퍼에 임시 저장됨- 버퍼는 주기적으로 로컬 디스크에 기록되며, 위치 정보는 마스터에 전송
Reduce작업 수행 시, 마스터는 관련Map출력 위치를 워커에게 전달- 워커는 원격 데이터를 가져와 동일한 키를 가진 항목을 정렬
- 정렬된 데이터는 사용자 정의
Reduce함수에 전달되고, 최종 결과는 출력 파일에 저장 - 모든 작업 종료 후 마스터는 사용자 프로그램을 재개함
2.2 HDFS 아키텍처
- NameNode: 마스터 역할. 파일 시스템의 이름 공간과 접근 권한을 관리
- DataNode: 슬레이브 역할. 실제 데이터 블록을 저장. 일반적으로 한 머신당 하나의 DataNode 운영
- Heartbeat: DataNode가 정기적으로 상태를 보고하여 장애 감지
- BlockReport: 저장된 블록 목록을 마스터에 전달
2.3 참고 자료
- 환경 설정 절차
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경로에 복사
- 시스템 실행
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 실행
- Hadoop이 정상 실행 중인지 확인
HADOOP_HOME/bin을PATH에 추가JAVA_HOME환경 변수 설정- 수집 대상 데이터를 HDFS에 업로드
bin/hadoop fs -put urldir urldir
(첫 번째 urldir는 로컬 파일 경로, 각 줄마다 하나의 URL 포함)
- Nutch 실행 (deploy 디렉터리에서 실행)
bin/nutch crawl urldir -dir crawl -depth 3 -topN 10
실행 완료 시, HDFS에 crawl 디렉터리가 생성됨. 반드시 deploy 폴더에서 실행해야 하며, local 폴더에서는 분산 처리가 불가능하다.