MapReduce1:选择要获取的urls
[list]
输入:爬虫数据库文件
public Path generate(...) {
...
job.setInputPath(new Path(dbDir, CrawlDb.CURRENT_NAME));
job.setInputFormat(SequenceFileInputFormat.class);
}
Map() -> 如果date <= now, 反转成<CrawlDatum, url>
/** Selects entries due for fetch. */
public static class Selector implements Mapper ...{
private SelectorEntry entry = new SelectorEntry();
/** Select & invert subset due for fetch. */
public void map(WritableComparable key, Writable value,
OutputCollector output, Reporter reporter)
throws IOException {
Text url = (Text)key;
...
CrawlDatum crawlDatum = (CrawlDatum)value;
if (crawlDatum.getStatus() == CrawlDatum.STATUS_DB_GONE ||
crawlDatum.getStatus() == CrawlDatum.STATUS_DB_REDIR_PERM)
return; // don't retry
if (crawlDatum.getFetchTime() > curTime)
return; // not time yet
LongWritable oldGenTime = (LongWritable)crawlDatum.getMetaData().get(Nutch.WRITABLE_GENERATE_TIME_KEY);
if (oldGenTime != null) { // awaiting fetch & update
if (oldGenTime.get() + genDelay > curTime) // still wait for update
return;
}
...
// record generation time
crawlDatum.getMetaData().put(Nutch.WRITABLE_GENERATE_TIME_KEY, genTime);
entry.datum = crawlDatum;
entry.url = (Text)key;
output.collect(sortValue, entry); // invert for sort by score
}
}
以随机整数为种子, 用hash函数来划分数据块
/**
* Generate fetchlists in a segment.
* @return Path to generated segment or null if no entries were selected.
* */
public Path generate(...) {
...
job.setInt("partition.url.by.host.seed", new Random().nextInt());
}
public static class Selector implements Mapper, Partitioner, Reducer {
private Partitioner hostPartitioner = new PartitionUrlByHost();
...
/** Partition by host. */
public int getPartition(WritableComparable key, Writable value,
int numReduceTasks) {
return hostPartitioner.getPartition(((SelectorEntry)value).url, key,
numReduceTasks);
}
...
}
/** Partition urls by hostname. */
public class PartitionUrlByHost implements Partitioner {
private int seed;
...
public void configure(JobConf job) {
seed = job.getInt("partition.url.by.host.seed", 0);
...
}
/** Hash by hostname. */
public int getPartition(WritableComparable key, Writable value,
int numReduceTasks) {
...
int hashCode = (url==null ? urlString : url.getHost()).hashCode();
// make hosts wind up in different partitions on different runs
hashCode ^= seed;
return (hashCode & Integer.MAX_VALUE) % numReduceTasks;
}
}
Reduce()是同一化
以CrawlDatum.linkCount降序排序
输出链接数最多的N个CrawlDatum实体
[/list]
MapReduce2:准备获取
- Map()是反向;Partition()根据主机划分;Reduce()是同一化
- Reduce: 合并CrawlDatum成单个入口
- 输出: <url,CrawlDatum>文件集,用来并行地获取
分享到:
相关推荐
Nutch 的源代码解析对于深入理解搜索引擎的工作原理以及自定义搜索引擎的实现非常有帮助。下面我们将详细探讨 Nutch 的注入(Injector)过程,这是整个爬取流程的第一步。 Injector 类在 Nutch 中的作用是将输入的 ...
1. **源代码结构**:Nutch 的源代码通常分为几个主要模块,包括`conf`(配置文件)、`bin`(脚本和可执行文件)、`src`(源代码)以及`lib`(库文件)。`src`目录下进一步细分为`java`和`python`,分别包含Java 和 ...
《Nutch源码分析——深入理解tar和zip格式》 Nutch是一款开源的网络爬虫项目,它在大数据处理和搜索引擎构建领域具有广泛的应用。本文将深入探讨如何获取和理解Nutch的源码,以及涉及的tar和zip两种常见的文件压缩...
Nutch的源代码包含了整个项目的完整实现,包括爬虫、索引器、搜索器以及相关的配置和文档。这对于开发者和研究者来说是一个宝贵的资源,他们可以深入理解搜索引擎的工作原理,学习如何处理大规模的网络数据,或者对...
lucene nutch 搜索引擎 开发 实例 源代码 源码 包含lucene使用的所有源代码,从建立索引,搜索,删除,排序,都有,非常齐全 还有PDF 解析,WORD解析 ,EXCEL,ppt,xml解析等,,都有源码实现 还有nutch源码,spider...
Nutch的源码分析主要涉及以下几个关键知识点: 1. **网络爬虫**:Nutch的核心功能是作为一个网络爬虫,它自动遍历互联网上的网页,通过跟踪页面间的链接来发现新的URL。它使用种子URL开始,然后递归地抓取与这些...
5. **链接分析**:Nutch使用PageRank算法对网页进行链接分析,评估网页的重要性。这种算法是搜索引擎排名的关键部分,有助于提升搜索结果的相关性。 6. **数据存储**:Nutch默认使用Hadoop的HDFS作为数据存储系统,...
### Nutch 1.2 源码阅读深入解析 #### Crawl类核心作用与流程概览 在深入了解Nutch 1.2源码之前,我们先明确Nutch的架构和工作流程。Nutch作为一款开源搜索引擎框架,其功能涵盖网页抓取、索引构建以及查询处理。...
通过分析和学习Nutch-1.5.1源码,开发者不仅可以掌握搜索引擎的核心技术,还能进一步提升在大数据处理、分布式系统和Java编程方面的专业能力。这对于从事相关领域工作或是研究搜索引擎优化(SEO)、信息检索和推荐...
**步骤三:获取Nutch源代码** 从Nutch的GitHub仓库克隆最新代码,通常使用命令: ```bash git clone https://github.com/apache/nutch.git ``` 这将创建一个名为`nutch`的目录,包含了项目的全部源代码。 **步骤四...
《lucene+nutch搜索引擎开发源码1》是一个包含开源搜索引擎项目Lucene和Nutch源代码的压缩包,主要针对搜索引擎开发的学习和实践。这个压缩包是书籍《lucene+nutch搜索引擎开发》的一部分,由于源码量较大,因此分为...
相对于那些商用的搜索引擎, Nutch作为开放源代码 搜索引擎将会更加透明, 从而更值得大家信赖. 现在所有主要的搜索引擎都采用私有的排序算法, 而不会解释为什么一个网页会排在一个特定的位置. 除此之外, 有的搜索...
1. **Nutch框架**:Nutch的核心框架提供了爬虫的基本架构,包括种子URL的管理、网页抓取、分词、链接分析等。框架设计灵活,支持插件机制,方便开发者根据需求定制。 2. **Fetcher模块**:负责从Web上下载网页。它...
Nutch 是一个高度可扩展且开放源代码的网络爬虫项目,由 Apache 软件基金会维护。它不仅能够抓取网页,还能进行全文检索,通常运行在 Linux 环境下。而 MyEclipse 是一款功能强大的集成开发环境 (IDE),用于 JavaEE ...
Nutch则是一个完整的网络爬虫项目,它扩展了Lucene的功能,集成了网页抓取、分析、存储和索引等一整套流程。Nutch的源码揭示了其如何使用HTTP协议抓取网页,通过Parser解析HTML内容,然后使用Lucene进行索引。特别地...
《Lucene+nutch搜索引擎开发》书附带的源代码
在`apache-nutch-1.5.1`这个压缩包中,你将找到源代码、构建脚本、文档、配置文件以及示例数据。通过对这些内容的阅读和实践,你可以深入了解搜索引擎的运作机制,进一步提升你的Java编程和分布式系统技能。同时,...
通过理解和分析 `Crawl` 类的源码,开发者可以更好地掌握 Nutch 如何处理输入,以及如何根据这些输入配置和执行复杂的网络抓取任务。对于想要深入了解 Nutch 或者想要定制 Nutch 功能的人来说,研究 `Crawl` 类的...