이 튜토리얼은 간단한 Nutch 2.2.1 + Solr 4.3.1 설정을 작성합니다.

2.x 이후 Nutch는 Apache Gora를 데이터 저장소 백엔드로 사용합니다. 특정 Gora 데이터 저장소를 선택해야합니다. 이 튜토리얼에서는 HBase 0.90.4를 사용합니다.

이러한 도구의 특정 버전 만 원활하게 함께 작동합니다. 항상 최신 버전의 프로그램을 선택하지 마십시오.

다운로드

새 디렉토리를 만들고이 파일을 다운로드 한 다음 압축을 풉니 다. trynutch이 튜토리얼에서는이 디렉토리 를 호출 할 것이다 .

  • 누치 . 이 자습서는 다음을 사용합니다 Nutch 2.2.1.
  • HBase . 이 자습서는 다음을 사용합니다 HBase 0.90.4.
  • Solr . 이 자습서는 다음을 사용합니다 Solr 4.3.1.

HBase 구성

HBase 및 사육사 저장소 디렉토리를 설정해야합니다. 편집 trynutch/hbase-0.90.4/conf/hbase-site.xml:

<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>file:///path/to/trynutch/hbase</value>
  </property>
  <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/path/to/trynutch/zookeeper</value>
  </property>
</configuration>

이 후 다음 명령을 사용하여 HBase를 시작할 수 있습니다.

$ ./trynutch/hbase/bin/start_hbase.sh

특히 당신은 hbase 명령 줄 유틸리티를 실행할 수 있습니다 :

$ ./bin/hbase shell

다음 명령을 사용하여 HBase를 다시 중지 할 수 있습니다.

$ ./trynutch/hbase/bin/stop_hbase.sh

(내 mashine 때로는 stop_hbase.sh영원히 걸립니다. 삭제 trynutch/hbase및 trynutch/zookeeper지우기 /tmp및 몇 번 다시 시작이 문제를 해결할 것으로 보인다.)

우분투 시스템에서 hbase을 실행하는 데 문제가 /etc/hosts있다면 호스트와 로컬 호스트가 동일한 IP 주소 (127.0.0.1)를 가지고 있는지 살펴보고 싶을 것 입니다. 우분투 시스템에서는 현재 호스트에 127.0이 있습니다. 1 .1 이 문제에 대한 추가 정보 찾기

Nutch 설정

웹 크롤러의 이름을 설정해야합니다. 또한 Nutch에게 HBase를 Gora 데이터 저장소 백엔드로 사용한다고 알려야합니다. 수정 trynutch/apache-nutch-2.2.1/conf/nutch-site.xml.

<configuration>
  <property>
    <name>http.agent.name</name>
    <value>your-crawler-name</value>
  </property>
  <property>
    <name>storage.data.store.class</name>
    <value>org.apache.gora.hbase.store.HBaseStore</value>
    <description>Default class for storing data</description>
  </property>
</configuration>

이 행을 trynutch/apache-nutch-2.2.1/conf/gora.properties다음 과 같이 변경하십시오 .

gora.datastore.default=org.apache.gora.hbase.store.HBaseStore

열기 trynutch/apache-nutch-2.2.1/ivy/ivy.xml아래로 스크롤하여 섹션 Gora artifacs에 주석 처리를 해제하십시오.

<dependency org="org.apache.gora" name="gora-hbase" rev="0.3" conf="*->default" />

이제 Nutch (2.x 소스 아카이브 만 사용할 수 있기 때문에)를 컴파일해야합니다.

$ cd trynutch/apache-nutch-2.2.1/
$ ant runtime

(이것은 처음으로 시간이 오래 걸릴 수도 있습니다. 내 마신에서는 25 분이 걸렸습니다.)

Solr 구성

Nutch와 함께 제공되는 데이터베이스 스키마는 구형입니다.

이 스키마를 다운로드 하여 저장하십시오 trynutch/solr-4.3.1/example/solr/collection1/conf/schema.xml.

Solr을 시작하십시오.

$ cd trynutch/solr-4.3.1/example/
$ java -jar start.jar

Solr이 실행 중이면 다음 사이트에 액세스 할 수 있어야합니다.

http://localhost:8983/solr/admin/

러닝 너치

HBase 및 Solr이 실행 중인지 확인하십시오.

이 자습서의 크롤링 범위를 제한 trynutch/apache-nutch-2.2.1/runtime/local/conf/regex-urlfilter.txt하고 마지막 줄을 다음과 같이 변경하십시오.

+^http://work-at-google.com

Nutch와 함께 기어 가기.

$ cd trynutch/apache-nutch-2.2.1/runtime/local/
$ mkdir urls
$ echo "http://work-at-google.com" > urls/seed.txt
$ bin/nutch inject urls
$ bin/nutch generate -topN 5
$ bin/nutch fetch -all
$ bin/nutch parse -all
$ bin/nutch updatedb

이제이 데이터 Solr을 피드하십시오.

$ bin/nutch solrindex http://localhost:8983/solr/ -all

이제 http : // localhost : 8983 / solr / # / collection1 / query 에서 Solr의 데이터를 검색 할 수 있습니다 .

출처


'빅데이터 > Nutch' 카테고리의 다른 글

아파치 너치(Apache Nutch) Architecture & Crawling 구조  (0) 2018.08.05
크롤링데이터쓰기  (0) 2018.08.05


아파치 너치(Apache Nutch) Architecture & Crawling 구조


아파치 너치(Apache Nutch)의 Architecture와 Crawling 구조에 대해 알아보겠습니다. 

(실습에 사용할 Nutch2.x 버전을 기준으로 알아보았습니다.)



Apache Nutch Architecture



* 데이터 구조 (Data Structure)


Apache Nutch는 다음의 데이터 구조를 가지고 동작합니다.


· CrawlBase

Url : CrawlState 필드에 사용

CrawlState : 현재 상태를 나타내는 필드

CrawlDatum : 메타 데이터를 저장

CrawlHistory : 역순으로 정렬된 CrawlDatum 개체 목록


· CrawlList

Url : CrawlHistory 필드에 사용

(CrawlList는 다중의 동시적 크롤링을 위해 CrawlBase와 분리됨)


· FetchedContent

Url : BytesWritable, FetchStatus 필드에 사용

FetchStatus : fetch, 에러 코드, 기타 fetch 정보에 대한 상태를 가지며 메타 데이터를 저장. (다른 tool을 통해 CrawlBase로 변환되는 필드)


· ParsedContent

Url : MapWritable 필드에 사용

MapWritable : Writable(Text) 또는 Writable[] 객체를 포함하고 컨텐츠(href, header 등)내의 각각 다른 모든 유형의 요소를 parsing.


· Processing

ParsedContent를 가져와서 여러 개의 특정 데이터 파츠로 변환 (변환된 파츠는 시스템 상에서 Scoring에만 사용)

CrawlBase 업데이트, ParsedContent 분석, 다른 소스의 Data Integration 처리

Processor의 일부는 컨텐츠를 Scorer가 필요로 하는 포맷으로 변환

Processor는 분석, 업데이트, 차단 또는 제거 및 기타 데이터 처리의 유연성을 필요로 하므로 특정 데이터 구조에 제약을 받지 않음

(Scoring 프로그램이 1대1 관계에서 output data structure에 액세스 할 경우에만 제약을 받음)


· Scoring

Url : Float형으로 각각의 Field에 사용

Field : 이름, 값, score, Text의 Float형 필드. (lucene semantic을 필요로 하며 Score와 함께 인덱싱된 필드는 Field boost 되었다고 함)

Scoring : 분석시 각 Field의 형식을 출력하여 특정 데이터 파츠를 가져옴

Indexing : 문서의 boost를 토대로 문서의 최종 score를 생성

(각 Field의 값과 boost에 따라서 문서의 Field를 인덱싱하며 Field 값이나 boost값을 결정하지는 않음)


또한 Nutch의 데이터 타입(Data Type)은 두가지로 나뉘어집니다.


· Web Database

Nutch가 수집한 모든 Url에 대한 정보를 포함하며 여기에는 각각의 페이지들을 이어주는 링크 정보도 포함

Web DB에는 protocol://server/page 형식의 Url목록과 링크 정보를 저장


· Segment List

각각의 Segment는 fetch된 페이지와 색인 정보를 포함 (검색은 Segment 단위로 이루어짐)

이러한 Segment는 생성 시간을 파일명으로 사용하여 여러개가 생성될 수 있음


※ Segment

Fetch List : fetch된 페이지들의 이름을 가진 파일. Web DB에 의해 생성되며 웹 페이지의 분석과 랭킹 알고리즘을 적용하기 위한 Basic Data로 사용됨

Fetch Output : fetch된 파일의 정보를 포함한 파일. Nutch는 fetcher_content와 fetcher_text 라는 두가지 타입의 fetch output을 가짐

색인 : Lucene 색인을 참고


※ Fetch Output

fetcher_content : 웹 페이지의 원본 데이터를 그대로 가짐

fetcher_text : text형식의 데이터만을 가짐


이 두개의 파일은 fetch 과정이 끝난 후 fetch된 웹 페이지에 대해서 <key, value> 형식으로 구성된 index.data 형태로 재구성된다.


key : 현재 페이지가 존재하는 Segment 내에서 사용되는 일련번호 (Unique Key)

value : 일련번호에 대응하는 페이지의 문서 내용


fetch output 데이터는 Nutch reader에 의해 조회가 가능한 데이터 포맷으로 저장이 된다.

net.nutch.fetcher.FetcherContent와 net.nutch.fetcher.FetcherText를 이용해서 fetcher_content와 fetcher_text로부터 

데이터를 읽을 수 있다.


* 도구 (Tools)


Nutch의 데이터 구조와 함께 Crawling시 사용되는 도구입니다.


· Injector

데이터 소스를 CrawlBase에 주입하여 새로운 CrawlBase, CrawlHistory 객체를 생성

CrawlBase에서 Url의 상태를 업데이트하거나 수동으로 변경할 때 사용


· Generator

CrawlBase에서 CrawlList를 생성

(Generator 내의 Filter는 CrawlBase Url의 부분 집합에서만 실행되도록 생성 가능)


· Fetcher

CrawlList를 가져와서 FetchedContent 객체를 생성


· UpdateCrawl

CrawlBase의 Url을 FetchedStatus 객체로 업데이트


· FetchedContent

데이터베이스에 새로운 Url을 추가하지 않고 현재 Url만 업데이트


· Parser

FetchContent 소스에서 ParsedContent 객체를 생성

(여러 조건에 따라 다른 parser를 다중 실행 가능)


· Processors

New Url Processor : ParsedContent 소스에서 parsing된 새로운 Url을 가지고 CrawlBase를 업데이트하는 프로세서

Html Processor : ParsedContent의 Html 소스에 대한 특정한 Processing을 수행하는 프로세서

Link Processor : Url의 inlinks와 outlinks에 대한 특정한 데이터베이스를 생성하는 프로세서

BlackList Processor : 블랙리스트에 Url에 등록된 경우 indexing 과정에서 해당 Url과 컨텐츠를 제거하는 프로세서

Other Processor : 언어 식별, redirection된 Url의 처리 및 Scoring과 같은 기타 특정 기능을 수행하는 프로세서


· Scorers

Html Scorer : html을 분석하여 Scoring.

Link Scorer : 링크 분석을 통해 page-rank 유형의 score를 생성

Other Scorer : 기타 특정 기능을 수행하는 scorer


· Indexer

여러개의 Scoring 객체에서 Lucene 인덱스를 생성


· Query Tools

Nutch 내에서 사용되는 Query Tool



Crawling



Apache Nutch는 다음과 같은 5개의 Job으로 동작합니다.

* InjectorJob

Injector는 Crawling과 관련된 데이터를 저장하기 위해서 Apache Nutch가 만드는 디렉터리인 crawlDB.crawlDB에 필요한 URL를 추가하는 역할을 수행합니다. InjectorJob을 수행한 후엔 fetch 되지 않은 다수의 URL들이 crawlDB에 추가됩니다.


* GeneratorJob


InjectorJob을 수행하고 crawlDB에 추가된 URL들을 fetch 하기 전에 GeneratorJob을 수행합니다.

GeneratorJob은 새로운 batch를 생성하고 InjectorJob 이후에 URL이 추가된 webtable에서 fetch 작업을 수행할 URL들을 가져옵니다.


· Mapper


webtable에서 모든 URL을 읽어옵니다. Mapper는 다음과 같은 특징을 갖습니다.


- URL이 이전에 generate되었을 경우(mark가 생성되어 batchID가 있는 경우) skip 합니다.

- 선택적으로 URLNormalizer 또는 URLFilters를 사용하여 빠른 generate에 대한 제어가 가능합니다.

- URL의 fetch time을 확인합니다. (fetchTime이 현재 시점보다 이전일 경우에 대해 우선적으로 fetch 실행)

- URL에 대한 scoring을 실행합니다.

- fetch가 필요한 모든 URL에 대해서 score와 함께 산출합니다.


· Partition


모든 URL은 도메인, 호스트 또는 IP로 나눠집니다. 동일한 도메인(호스트, IP)의 모든 URL은 동일한 파티션에서 동일한 reduce task로 처리됩니다. 또한 각 파티션 내에서 모든 URL은 score 순서대로 정렬됩니다.

Partition은 다음과 같은 특징을 갖습니다.


- 선택적으로 Partitioning 하는 동안 normalize 처리를 할 수 있고 이것은 URL의 빠른 Partitioning을 비활성화합니다.

- IP로 Partitioning을 할 경우 DNS 분석시 부하가 많이 걸릴 수 있습니다.


· Reducer


파티션의 모든 URL을 읽고 선택하는 역할을 하는데, 전체 URL 수가 한계에 도달하거나 도메인(호스트, IP)당 URL수가 한계에 도달할 때까지 계속해서 작업을 진행합니다.

Reducer는 다음과 같은 특징을 갖습니다.


- 해당 도메인(호스트, IP)의 URL 수가 generate.max.count 속성 값을 초과하는 경우 특정 도메인에 대한 URL 선택을 중단하게 됩니다. Reducer는 map을 사용하여 추적이 이뤄지는데, 동일한 도메인의 경우 같은 reduce task 내에서 처리되기 때문에 더 잘 동작하게 되고 서로 다른 도메인이 많을 경우 map이 커지기 때문에 더딘 진행을 보입니다. (generate.max.count 속성값을 통해 reducer 개수를 조절 가능)

- 선택한 각각의 URL에 대해서 batchID를 마킹합니다.

- webtable의 row로 산출물을 출력합니다.


· Result


정리를 하면 maximum topN URL이 선택되고 webtable에 마킹이 이루어집니다. (topN URL은 항상 최상위 score에 따라 선택되지 않음)


각 reducer(파티션)은 topN/reducer 의 연산 결과를 통해 URL을 generate 할 수 있습니다. 그러나 Partitioning 으로 모든 reducer가 generate 가능한 URL 개수를 선택할 수 있는 것은 아닙니다. 그러나 이에 대한 보답으로 확장성을 얻습니다.


ex)

abc.com의 URL을 충분히 가지고 있을 경우 → abc.com의 URL을 제외할 수 있음

xyz.com을 가진 URL(낮은 score를 가진 경우) → 포함될 가능성이 높음


설정예시)

topN = 2500

generate.max.count = 100

reducer = 5


partition 1에 대한 input :

abc.com : 10 개의 URL

klm.com : 100 개의 URL

xyz.com : 1000 개의 URL


partition 1의 output :

abc.com : 10 개의 URL

klm.com : 100 개의 URL (topN URL)

xyz.com : 100 개의 URL


※ topN/reducer → 2500/5 = 500 URL generate 가능. 

klm.com을 topN URL로 선택하고 이 기준에 따라 topN URL보다 적은 개수의 도메인은 포함되며, 많은 개수의 URL은 제외됨


* FetcherJob


FetcherJob은 GeneratorJob에 의해 생성된 URL을 fetch 하는 역할을 수행합니다. command 명령어로 실행시 설정한 파라미터에 따라 특정batchID의 선택적인 URL 또는 모든 URL을 가져와 fetch를 할 수 있습니다.


· Mapper


GeneratorJob에서의 역할과 마찬가지로 webtable에서 모든 URL을 읽어옵니다. Mapper의 특징은 다음과 같습니다.


- generator의 mark의 일치여부를 확인합니다.

- URL에 fetcher mark가 있을 때 'continue' 인자값이 있을 경우 skip 처리됩니다. 반대의 경우는 현재 batchID의 batch에서 fetch 되었던 모든 URL을 다시 refetch하는 작업을 수행합니다.

- 랜덤으로 생성된 int값을 키값으로 산출합니다. (모든 URL에 대한 shuffle 적용)


· Partition


호스트 별로 Partitioning 작업이 이루어집니다.


· Reducer


FetcherJob의 Reducer는 host, domain, IP의 대기 큐(queue)를 지원합니다. Reducer의 특징은 다음과 같습니다.


- 랜덤화된 URL을 fetch queue에 넣고 fetch queue에서 fetch할 항목을 스캔합니다. 밸런스 있는 fetch를 위해 도메인(host, IP) 당 1개의 queue가 설정됩니다.

- 각각의 URL에 대해 fetch 작업을 수행합니다.

- webtable에 성공, 실패 여부를 출력해줍니다. (이 때의 fetchTime 값은 현재시간으로 설정됩니다.)

- parsing이 구성된 경우 ParseUtil class를 사용하여 해당 contents를 parsing 합니다. (이 때 fetch되지 않은 항목은 제외됩니다.)


* ParserJob


ParserJob은 FetcherJob 이후에 fetch 된 URL을 Parsing(구문 분석)하는 역할을 수행합니다. 설정된 batchID 내의 모든 URL을 대상으로 이루어지며 command 명령어로 실행시 설정한 파라미터에 따라서 전체 또는 부분적인 Parsing이 가능합니다.


· Mapper


이전 단계에서의 역할과 마찬가지로 webtable에서 모든 URL(webpage)을 읽어옵니다. Mapper의 특징은 다음과 같습니다.


- fetch mark의 일치 여부를 확인합니다.

- URL(webpage)이 이미 parsing 되었다면 skip 처리합니다.

- row 단위로 parsing을 진행합니다.

- row 단위로 parsing된 결과를 webtable에 출력합니다.


* DbUpdaterJob


ParserJob 완료 이후에 FetcherJob의 결과를 제공하여 마지막으로 가져온 URL을 기준으로 데이터베이스를 업데이트하는 역할을 수행합니다. 또한 각각의 row의 inlinks, outlinks, fetchTime 및 score를 올바른 값으로 업데이트합니다.


· Mapper


DbUpdaterJob에서도 Mapper는 webtable의 모든 URL row를 읽어옵니다. Mapper의 특징은 다음과 같습니다.


- 모든 outlinks의 score를 업데이트합니다.

- 모든 outlinks를 score와 anchor(linktext)와 함께 출력합니다.

- rowkey 자체를 score와 함께 출력합니다.


· Partition


다음 조건에 맞춰서 Reducer에서 inlinks 값이 score에 따라 정렬되도록 합니다.


- {url}에 따른 파티션

- {url}에 따른 그룹화

- {url, score}에 따른 정렬


· Reducer


DbUpdaterJob에서의 Reducer는 다음과 같은 특징을 갖습니다.


- Reducer의 key는 webtable에서의 각각의 row 이며 inlinks가 reduce의 값이 됩니다.

- fetchTime을 업데이트 합니다.

- inlinks를 업데이트 합니다. (db.update.max.inlinks 속성값으로 limit 값을 설정할 수 있습니다.)

- inlinks 기반의 각각의 row가 가진 score 값을 업데이트합니다.

- 각각의 row를 webtable에 출력합니다.



이상으로 Apache Nutch의 Architecture와 Crawling 구조에 대해서 알아보았습니다.



※ 참고 문헌


  • Abdulbasit Shaikh, Zakir Laliwala, 『Web Crawling and Data Mining with Apache Nutch』, Packt Publishing(2013)

  • www.joinc.co.kr, 아파치 너치, https://www.joinc.co.kr/w/Site/Search/Document/nutch

  • wiki.apache.org, apache nutch, https://wiki.apache.org/nutch/
  • wiki.apache.org, apache nutch architecture, https://wiki.apache.org/nutch/Nutch2Architecture
  • wiki.apache.org, apache nutch crawling, https://wiki.apache.org/nutch/Nutch2Crawling



출처: http://freestrokes.tistory.com/53 [FREESTROKES' Develog]

'빅데이터 > Nutch' 카테고리의 다른 글

Nutch Solr 튜토리얼  (0) 2018.08.12
크롤링데이터쓰기  (0) 2018.08.05

Nutch를 사용하여 크롤링을 한 후

실제로 크롤링된 데이터를 사용하기위해서는

필요한 데이터를 추출하는 작업이 필요하다.

크롤링한 데이터는 [사용자지정 크롤 디렉토리]/segments/ 에 저장되는데

이 데이터를 읽어 들이면 된다.

 

1. 크롤링 데이터를 읽는 명령어의 기본 형태

bin/nutch readseg -dump [사용자지정 크롤 디렉토리]/segments/[filename] [저장 디렉토리] [-옵션]

예) bin/nutch readseg -dump crawl/segments/201307112948 dump -nocontent -nofetch -nogenerate -noparse -noparsedata

 

2. 옵션

-nocontent : 크롤링한 데이터에서 HTML을 저장하지 않는 옵션

-noparsetext : 추출한 HTML에서 태그를 제거한 문자열을 저장하지 않는 옵션

-그 외 : 테스트중...

 

3. 사용예

크롤링한 URL과 HTML을 노출하기 위해서는 아래와 같이 사용하면 된다.

-nocontent 옵션을 제외

bin/nutch readseg -dump crawl/segments/20130709101941 dump -nofetch -nogenerate -noparse -noparsedata -noparsetext

 

크롤링한 데이터에서 HTML태그를 제외한 데이터가 필요하면 아래와 같이 사용하면 된다.

-noparsetext 옵션을 제외

bin/nutch readseg -dump crawl/segments/20130709101941 dump -nofetch -nogenerate -noparse -noparsedata

 

4. SEGMENT 파일 하나로 합치기

크롤링을 하면 SEGMENT 파일이 다수 생성되게 된다.

하지만 덤프파일은 하나만 존재할수있기때문에 위와 같이 readseg 명령어를 사용하여

덤프파일을 생성하면 다수의 SEGMENT에 대한 덤프파일을 생성하기가 어려워 진다.

그래서 다수의 ③SEGMENT 파일을 하나로 합친후

readseg 명령어로 ④덤프파일을 만드는 방법이 필요하다.

 

4-1. SEGMENTS MERGING 기본 문법

bin/nutch mergesegs [MERGE한 데이터를 저장할 디렉토리] [-dir SEGMENTS 디렉토리] [-옵션]

예) bin/nutch mergesegs crawl/segments-all -dir crawl/segments

위와같이 mergesegs 명령어를 사용하면 다수의 SEGMENTS를 하나로 합칠 수 있다.

이렇게 하나로 만든 SEGMENT 파일을 읽어들여 크롤링한 데이터를 추출하면 된다.

이 외에 옵션에는 -filter 와 -slice 가 있는데 이 옵션에 대해서는 아직 살펴보지 못했다.

 

5. 마무리

크롤링한 데이터를 추출하여 사용할 수 있는 데이터로 만들었다. 이제 이 파일을 가지고 어떻게 처리 할지는 각자 고민하는 수바께 없다.



출처: http://whybk.tistory.com/16 [궁금해 하지 말자]

'빅데이터 > Nutch' 카테고리의 다른 글

Nutch Solr 튜토리얼  (0) 2018.08.12
아파치 너치(Apache Nutch) Architecture & Crawling 구조  (0) 2018.08.05

+ Recent posts