Nutch 原始碼分析 1

2021-06-19 12:33:03 字數 3804 閱讀 6372

org.apache.nutch.crawl.crawl類的主函式如下所示:

// 應該知道,nutch查詢檔案系統是基於linux系統的機制的,所以提供啟動的命令與linux的shell命令很相似。

public static void main(string args) throws exception

configuration conf = nutchconfiguration.create();

// 使用靜態類nutchconfiguration建立乙個org.apache.hadoop.conf.configuration例項,可以在hadoop的源**中檢視到該類的定義(讀取hadoop-site.xml配置檔案)

conf.adddefaultresource("crawl-tool.xml");

// 讀取並設定抓取工具的配置檔案,可以在nutch-0.9\conf目錄下找到

crawl-tool.xml檔案

jobconf job = new nutchjob(conf);

// 抓取任務配置例項的建立

path rooturldir = null;

// 初始urls檔案所在的目錄,使用hadoop的org.apache.hadoop.fs.path類建立目錄

path dir = new path("crawl-" getdate());

// 設定預設抓取到網頁的存放目錄。如果命令列中沒有指定-dir 的值就會使用預設的值:crawl-時間。

int threads = job.getint("fetcher.threads.fetch", 10);

// 設定預設抓取工作啟動執行緒數目,預設值為10。

int depth = 5;

// 預設抓取工作遍歷深度,預設值為5。

int topn = integer.max_value;

// 抓取任務抓取網頁的數量,預設為最大值。

for (int i = 0; i < args.length; i ) else if ("-threads".equals(args[i])) else if ("-depth".equals(args[i])) else if ("-topn".equals(args[i])) else if (args[i] != null)

} filesystem fs = filesystem.get(job);

// 根據抓取工作配置jobconf建立乙個用來存放抓取到的網頁的目錄。

if (fs.exists(dir))

if (log.isinfoenabled())

// 在目錄dir下面建立下面5個目錄,用來存放,抓取工作過程中不同操作生成的檔案或者目錄。

path crawldb = new path(dir "/crawldb");

path linkdb = new path(dir "/linkdb");

path segments = new path(dir "/segments");

path indexes = new path(dir "/indexes");

path index = new path(dir "/index");

path tmpdir = job.getlocalpath("crawl" path.separator getdate());

injector injector = new injector(conf);

// 根據configuration conf建立乙個injector例項

generator generator = new generator(conf);

// 根據configuration conf建立乙個generator例項

fetcher fetcher = new fetcher(conf);

// 根據configuration conf建立乙個fetcher例項

parsesegment parsesegment = new parsesegment(conf);

// 根據configuration conf建立乙個parsesegment例項

crawldb crawldbtool = new crawldb(conf);

// 根據configuration conf建立乙個crawldb例項

linkdb linkdbtool = new linkdb(conf);

// 根據configuration conf建立乙個linkdb例項

indexer indexer = new indexer(conf);

// 根據configuration conf建立乙個indexer例項

deleteduplicates dedup = new deleteduplicates(conf);

// 根據configuration conf建立乙個deleteduplicates例項

indexmerger merger = new indexmerger(conf);

// 根據configuration conf建立乙個indexmerger例項

// 初始化crawldb

injector.inject(crawldb, rooturldir);

// 從rooturldir目錄中讀取初始化urls,將urls注入到crawldb實體中去

int i;

for (i = 0; i < depth; i )

fetcher.fetch(segment, threads);

// 根據配置的執行緒數開始抓取網頁檔案

if (!fetcher.isparsing(job))

crawldbtool.update(crawldb, new path, true, true);

// 更新crawldb

}if (i > 0) );

// 複製索引檔案

merger.merge(fs.listpaths(indexes), index, tmpdir);

// 將索引目錄index中的索引檔案合併後寫入到indexes目錄中

} else

if (log.isinfoenabled()) }

通過上面的源**的整體分析,總結一下具體都在這裡做了哪些工作:

1、讀取命令列引數,合法以後才繼續初始化配置例項;

2、通過讀取hadoop-site.xml配置檔案,初始化乙個configuration例項,並根據crawl-tool.xml檔案內容設定抓取工作配置;

3、設定一些預設抓取工作引數,如果命令列中沒有指定就會按照預設的引數值進行抓取工作的執行,比如,抓取工作抓取到的網頁檔案存放目錄rooturldir、啟動的抓取工作程序數threads、抓取深度depth、抓取網頁數量topn;

4、建立抓取工作抓取到的網頁檔案的存放目錄,及其子目錄(crawldb、linkdb、segments、indexes、index),這些子目錄有的是用來存放原生網頁,有的是預處理網頁檔案,有的是網頁解析出的文字內容及其其它相關資料等等;

5、在抓取工作及其索引過程中,要進行很多操作來對網頁檔案或資料進行處理,這通過初始化一些實現了這些操作的類的例項來完成的,例如:injector、generator、fetcher、parsesegment、crawldb、linkdb、indexer、deleteduplicates、indexmerger。這些類中,有的是作為實體類,像crawldb、linkdb,它們需要在抓取工作執行過程中及時更新,保持資料狀態的處於良好正確狀態。

6、最後,就開始執行相關操作了,包括初始化crawldb、生成抓取工作列表、抓取網頁檔案、更新crawldb、倒排links、建立索引、複製索引檔案、合併索引檔案。

nutch原始碼閱讀 1 Crawl

org.apache.nutch.crawl.crawl實現的是乙個完成的抓取過程,所以由它開始。perform complete crawling and indexing to solr given a set of root urls and the solr parameter respec...

Nutch抓取原始碼分析之Crawl類

1 初始化乙個configuration例項設定抓取工作配置 2 設定一些預設抓取工作引數,比如程序數threads 抓取深度depth 抓取網頁數量topn 3 建立抓取工作抓取到的網頁檔案的存放目錄 crawldb linkdb segments indexes index 用來存放原生網頁,以...

cvDilate 原始碼分析 1

在cv.h檔案中對cvdilate的定義如下 cvapi void cvdilate const cvarr src,cvarr dst,iplconvkernel element cv default null int iterations cv default 1 iplconvkernel 指...