4


想知道nutch如何与hadoop集群一起工作。它如何将作业拆分到其他节点?它如何确保集群中的不同节点不会请求相同的 url?
谢谢你的建议。

4

1 回答 1

6

nutch 的阶段是:注入 -> 生成 -> 获取 -> 解析 -> 更新 -> 索引

这些 Fetch 阶段是 nutch 发送 url 请求的地方(因此我将只讨论这个阶段并在回答中生成阶段。)

生成阶段在 crawldb 中创建 url 的获取列表。在创建 fetchlist 时,属于同一主机的 url 通常属于同一分区,因为分区功能基于主机名。因此,最终的 fetch 列表将如下所示:

fetch list 1 : all urls of host a1, b1, c1
fetch list 2 : all urls of host a2, b2, c2
.............
.............

现在,当 Fetch 阶段读取这些 fetchlists 时,每个 fetchlist 都由 /assigned 处理给 fetch phase 的单个映射器。所以,

number of reducers in generate partition phase 
                        = the number of fetchlists created
                        = number of maps in fetch phase

如果 fetch 阶段的映射器获取主机 A 的一堆 url,则没有其他映射将具有同一主机的 url。当然,每个映射都可以有多个主机的 url,但其他映射器不会有来自这些主机的 url。

现在深入研究 fetch 的映射器:

它将有 n 个主机 h1、h2、... hn 的 URL。然后按主机形成提取队列。所有 url(获取项目)都填充在其各自主机的 fetchqueue 中。fetcher 线程在 fetchqueues 上进行轮询,从那里获取 url 并发送请求并将结果写回 hdfs。完成此操作后,他们会寻找其他可以处理的 fetchitems(url)。

我认为我可以设法以可以理解的方式把事情弄得一团糟。有关更多详细信息,请参阅工作的Fetcher.java代码。

注意:网址也可以根据 IP 进行分组。即使您可以调整以使 nutch 不基于主机名/IP 对 url 进行分组。这两件事都取决于您的配置。默认情况下,它将使用主机名对 url 进行分组。

于 2012-04-29T16:24:14.497 回答