inject -- inject new urls into the database
inject是在整个nutch运行的最初阶段执行,只执行一次,是将指定目录下的url信息注入到crawldb中。
inject的运行代码在org.apache.nutch.crawl.Injector 类中,implements Tool, 所以执行中先调用run方法。
看看run方法中都做了些什么:
public void inject(Path crawlDb, Path urlDir) throws IOException { 。。。。。。。 //建立一个队url排序的job JobConf sortJob = new NutchJob(getConf()); //job名称 sortJob.setJobName("inject " + urlDir); //job的输入路径 FileInputFormat.addInputPath(sortJob, urlDir); //没有对输入的文件格式化,采用默认的textinputformat //设置执行map的class sortJob.setMapperClass(InjectMapper.class); //job执行后的输出路径 FileOutputFormat.setOutputPath(sortJob, tempDir); //输出文件的格式 sortJob.setOutputFormat(SequenceFileOutputFormat.class); //输出的key的类型 sortJob.setOutputKeyClass(Text.class); //输出的value的类型 //CrawlDatum中是url信息,如抓取状态,抓取时间,分数等 sortJob.setOutputValueClass(CrawlDatum.class); //当前时间 sortJob.setLong("injector.current.time", System.currentTimeMillis()); //执行这个job,只有map RunningJob mapJob = JobClient.runJob(sortJob); /* * 根据mapred的counter来获取job执行完后的相关数据 * counter用来统计map或reduce执行的情况和数据的。 * counters下有多个group,每个group下有多个counter */ //得到注入了多少个url long urlsInjected = mapJob.getCounters().findCounter("injector", "urls_injected").getValue(); //得到过滤了多少个url long urlsFiltered = mapJob.getCounters().findCounter("injector", "urls_filtered").getValue(); 。。。。 。。。。 /* * 创建job,在createJob中对job进行一些通用设置,如下: * job.setInputFormat(SequenceFileInputFormat.class); job.setMapperClass(CrawlDbFilter.class); job.setReducerClass(CrawlDbReducer.class); FileOutputFormat.setOutputPath(job, newCrawlDb); job.setOutputFormat(MapFileOutputFormat.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(CrawlDatum.class); */ JobConf mergeJob = CrawlDb.createJob(getConf(), crawlDb); FileInputFormat.addInputPath(mergeJob, tempDir); mergeJob.setReducerClass(InjectReducer.class); JobClient.runJob(mergeJob); /* * 将上一次抓取url存放目录改为old,当前的为current * 如果db.preserve.backup为false,只保存当前的 */ CrawlDb.install(mergeJob, crawlDb); 。。。。 }
可以看到,在run方法中,先执行了一个job任务,这个任务是往crawldb中注入url文件目录下的记录,这里只有一个map任务,将结果输出到临时文件夹下,map输入的key-value对是文件行号--一行文本内容,输出的key-value对为每行的文本内容对象Text - CrawlDatum对象,CrawlDatum对象中保存的是有关每个url的信息,包括抓取状态,抓取间隔,分数等。mergeJob是对url进行合并,更新。
看看InjectMapper做了些什么:
public void configure(JobConf job) { this.jobConf = job; urlNormalizers = new URLNormalizers(job, URLNormalizers.SCOPE_INJECT); //重新抓取的时间,默认30天 interval = jobConf.getInt("db.fetch.interval.default", 2592000); //url过滤,参见nutch-default.xml中urlfilter.order属性 filters = new URLFilters(jobConf); //url分数过滤,参加nutch-default.xml中scoring.filter.order属性 scfilters = new ScoringFilters(jobConf); //inject注入的url的默认分值 scoreInjected = jobConf.getFloat("db.score.injected", 1.0f); curTime = job.getLong("injector.current.time", System.currentTimeMillis()); } public void close() {} public void map(WritableComparable key, Text value, OutputCollector<Text, CrawlDatum> output, Reporter reporter) throws IOException { String url = value.toString(); // value is line of text if (url != null && url.trim().startsWith("#")) { /* Ignore line that start with # */ return; } // if tabs : metadata that could be stored // must be name=value and separated by \t float customScore = -1f; int customInterval = interval; int fixedInterval = -1; Map<String,String> metadata = new TreeMap<String,String>(); /* * 在inject的url文件中,不仅可以设置要抓取的url,还可以设置关于这个url的一些操作信息 * 如: www.163.com nutch.score=2.5f nutch.fetchInterval=10 */ if (url.indexOf("\t")!=-1){ String[] splits = url.split("\t"); //url url = splits[0]; //url的相关信息 for (int s=1;s<splits.length;s++){ // find separation between name and value int indexEquals = splits[s].indexOf("="); if (indexEquals==-1) { // skip anything without a = continue; } String metaname = splits[s].substring(0, indexEquals); String metavalue = splits[s].substring(indexEquals+1); //url的分数 if (metaname.equals(nutchScoreMDName)) { try { customScore = Float.parseFloat(metavalue);} catch (NumberFormatException nfe){} } //抓取间隔 else if (metaname.equals(nutchFetchIntervalMDName)) { try { customInterval = Integer.parseInt(metavalue);} catch (NumberFormatException nfe){} } //固定抓取间隔 else if (metaname.equals(nutchFixedFetchIntervalMDName)) { try { fixedInterval = Integer.parseInt(metavalue);} catch (NumberFormatException nfe){} } else metadata.put(metaname,metavalue); } } try { //规范化url url = urlNormalizers.normalize(url, URLNormalizers.SCOPE_INJECT); //过滤url,如果该url被过滤了,返回null url = filters.filter(url); // filter the url } catch (Exception e) { if (LOG.isWarnEnabled()) { LOG.warn("Skipping " +url+":"+e); } url = null; } if (url == null) { /* * 如果没有获取到group,会new一个 * 如果没有在该组下获取到counter,也会new一个 * 被过滤的url增加1个 */ reporter.getCounter("injector", "urls_filtered").increment(1); } else { // if it passes value.set(url); // collect it CrawlDatum datum = new CrawlDatum(); //url状态 datum.setStatus(CrawlDatum.STATUS_INJECTED); // Is interval custom? Then set as meta data if (fixedInterval > -1) { // Set writable using float. Flaot is used by AdaptiveFetchSchedule datum.getMetaData().put(Nutch.WRITABLE_FIXED_INTERVAL_KEY, new FloatWritable(fixedInterval)); datum.setFetchInterval(fixedInterval); } else { datum.setFetchInterval(customInterval); } //当前时间 datum.setFetchTime(curTime); // now add the metadata Iterator<String> keysIter = metadata.keySet().iterator(); while (keysIter.hasNext()){ String keymd = keysIter.next(); String valuemd = metadata.get(keymd); datum.getMetaData().put(new Text(keymd), new Text(valuemd)); } if (customScore != -1) datum.setScore(customScore); else datum.setScore(scoreInjected); try { //这里暂时不明白 scfilters.injectedScore(value, datum); } catch (ScoringFilterException e) { if (LOG.isWarnEnabled()) { LOG.warn("Cannot filter injected score for url " + url + ", using default (" + e.getMessage() + ")"); } } //注入成功的url增加1个 reporter.getCounter("injector", "urls_injected").increment(1); output.collect(value, datum); } } }
这里面主要就是对url规范和过滤,最终的url写到临时文件里,给reducer用。
InjectReducer比较简单就是对url合并和状态更新。
这里有个疑问就是为什么这里会分为2个mapred任务来执行呢?只是为了复用crawldb的job吗?
相关推荐
5. **配置文件**:如 `conf/nutch-default.xml` 和 `conf/nutch-site.xml`,分别包含 Nutch 的默认配置和用户自定义配置。 6. **抓取策略**:Nutch 支持基于链接的抓取策略,如 PR(PageRank)和 TF-IDF(Term ...
3. **配置Nutch**:修改`conf/nutch-site.xml`等配置文件,设置爬虫的启动参数,如抓取范围、URL过滤规则等。 4. **创建数据库**:Nutch通常使用Hadoop HDFS作为数据存储,因此需要设置Hadoop环境,并创建相应的...
Nutch-1.9 是一个开源的网络爬虫软件,被广泛用于数据挖掘、搜索引擎构建以及网络信息提取。它的最新版本提供了许多改进和优化,使得它成为开发者和研究者手中的利器。Nutch的设计目标是易用性和可扩展性,允许用户...
这个源码包 "apache-nutch-1.3-src.tar.gz" 和 "nutch-1.3.tar.gz" 包含了 Nutch 1.3 的源代码和编译后的二进制文件,对于开发者和研究者来说是非常有价值的资源。 **Nutch 概述** Nutch 是基于 Java 开发的,遵循 ...
在这个"apache-nutch-1.4-bin.tar.gz"压缩包中,包含了运行 Nutch 的所有必要组件和配置文件,适合初学者和开发者快速部署和实验。 **Nutch 的核心组成部分:** 1. **爬虫(Spider)**:Nutch 的爬虫负责在网络中...
nutch配置nutch-default.xml
在“apache-nutch-1.7-src.tar.gz”这个压缩包中,你将获得Nutch 1.7的源代码,这使得开发者可以深入了解其工作原理,并对其进行定制和扩展。解压后的文件夹“apache-nutch-1.7”包含了所有必要的组件和配置文件。 ...
nutch不用安装,是个应用程序,下载后为nutch-1.6.tar.gz,双击桌面上的cygwin快捷方式;执行以下命令: $ cd D:/Downloads/Soft $ tar zxvf nutch-1.0.tar.gz 在e盘下面出现nutch-0.9文件夹说明解压成功了.然后环境...
Nutch-1.5.1源码是Apache Nutch项目的一个重要版本,它是一个高度可扩展的、开源的网络爬虫和全文搜索引擎框架。Nutch最初由Doug Cutting创建,后来成为了Hadoop项目的一部分,因为其在大数据处理和分布式计算方面的...
1. **导入项目**:首先,你需要在Eclipse或IDEA中创建一个新的Java项目,然后将解压后的`apache-nutch-1.16`目录作为项目的根目录导入。在IDE中,这通常通过"Import Existing Project"或"Open Project"功能完成。 2...
apache-nutch-2.3.1-src.tar ,网络爬虫的源码, 用ivy2管理, ant runtime 编译 apache-nutch-2.3.1-src.tar ,网络爬虫的源码, 用ivy2管理, ant runtime 编译
这个`apache-nutch-1.6-src.tar.gz`文件包含了Nutch 1.6的源代码,允许开发者深入研究其内部机制,定制自己的爬虫需求,或者为项目贡献代码。 源代码包`apache-nutch-1.6`中通常包含以下几个关键部分: 1. **源...
Nutch是一款刚刚诞生的完整的开源搜索引擎系统,可以结合数据库进行索引,能快速构建所需系统。Nutch 是基于Lucene的,Lucene为 Nutch 提供了文本索引和搜索的API,所以它使用Lucene作为索引和检索的模块。Nutch的...
在 Nutch-1.3 的源码中,我们可以深入理解其工作原理和核心组件。源码分析可以帮助我们掌握以下关键知识点: 1. **网络爬虫框架**:Nutch 提供了一个完整的爬虫框架,包括种子 URL 的管理、网页的抓取、下载、解析...
- 配置:修改`conf/nutch-site.xml`等配置文件,设置爬虫的抓取策略、存储位置、URL种子等。 - 插件定制:根据需求选择或编写解析器、过滤器等插件,放入`plugins`目录。 - 抓取(Crawl):使用`bin/nutch crawl`...
- **下载Nutch源码**:访问Apache官方网站或其镜像站点,下载Nutch-0.9源码并解压缩至本地目录。 - **创建Java Project**:在Eclipse中创建一个新的Java Project,命名为"Nutch",并选择“Create project from ...
在`apache-nutch-2.2.1`这个压缩包中,你将找到以下关键组成部分: 1. **源代码结构**:Nutch 的源代码通常分为几个主要模块,包括`conf`(配置文件)、`bin`(脚本和可执行文件)、`src`(源代码)以及`lib`(库...
- **配置文件**:Nutch的运行依赖于一系列配置文件,如`conf/nutch-site.xml`,用户可以通过修改这些文件来定制爬虫行为。 - **插件系统**:Nutch支持丰富的插件体系,如URL过滤器、解析器、索引器等,开发者可以...
4. **配置与部署**:解压 "apache-nutch-1.9" 文件后,需要根据你的环境配置`conf/nutch-site.xml`文件,设置包括抓取间隔、并发度、存储路径等参数。同时,可能还需要配置`conf/regex-urlfilter.txt`和`conf/...
"apache-nutch-1.4-src.zip"是Nutch源码的zip压缩版本,用户可以直接解压并访问其中的源代码。 要获取和解压这些源码,你可以使用各种工具,如在Linux或Mac系统中使用命令行的tar和unzip命令,或者在Windows中使用...