Nutch如何与Hadoop集群合作?

Fre*_*dom 4 hadoop nutch

所有
我想知道用Hadoop集群如何Nutch的作品.它如何将作业拆分到其他节点?它如何确保群集中的不同节点不会请求相同的URL?
谢谢你.

Tej*_*til 5

nutch的阶段是:Inject - > generate - > Fetch - > Parse - > Update - > Index

其中Fetch阶段是nutch发送url请求的地方(因此我将仅讨论此阶段并在答案中生成阶段.)

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

fetch list 1 : all urls of host a1, b1, c1
fetch list 2 : all urls of host a2, b2, c2
.............
.............
Run Code Online (Sandbox Code Playgroud)

现在,当Fetch阶段读取这些fetchlists时,每个fetchlist由/分配给一个获取阶段的映射器进行处理.所以,

number of reducers in generate partition phase 
                        = the number of fetchlists created
                        = number of maps in fetch phase
Run Code Online (Sandbox Code Playgroud)

如果获取阶段的映射器获得主机A的一堆URL,则没有其他映射将具有相同主机的URL.当然,每个地图都可以有多个主机的网址,但没有其他地图可以有来自这些主机的网址.

现在深入挖掘fetch的映射器:

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

我认为我可以设法以可理解的方式处理混乱.有关更多详细信息,请参阅Fetcher.java代码以了解其工作原理.

注意:网址也可以基于IP进行分组.甚至你可以调整以使nutch不基于主机名/ IP对URL进行分组.这些都取决于你的配置.默认情况下,它将使用主机名对URL进行分组.