hadoop - Nutch 如何与 Hadoop 集群协同工作?

标签 hadoop nutch

全部
我想知道nutch 是如何与hadoop 集群一起工作的。它如何将作业拆分到其他节点?它如何确保集群中的不同节点不会请求相同的 url?
感谢副词。

最佳答案

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

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

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

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

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

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

如果一个mapper在fetch阶段得到了主机A的一堆url,其他map就不会有同一主机的url。当然,每个map可以有多个host的url,但没有其他mapper将具有来自这些主机的 url。

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

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

我认为我可以设法以易于理解的方式解决问题。有关详细信息,请参阅 Fetcher.java工作代码。

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

关于hadoop - Nutch 如何与 Hadoop 集群协同工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10360759/

相关文章:

hadoop - 配置Nutch写入Apache Kudu

hbase - java.lang.ClassNotFoundException : org. apache.gora.hbase.store.HBaseStore

java.lang.NullPointerException(nutch 2.2.1 和 MySql 作为数据存储)

java - nutch有网络服务API吗?

python - Tensorflow 从 HDFS mac 读取 : java. lang.NoSuchFieldError: LOG

hadoop - Jcascalog 查询 HDFS 上的 thrift 数据

hadoop - 为什么我没有在 hadoop 的输出文件中写入输出?

hadoop - 每年出版书籍频率的 Pig 脚本

hadoop - 替换 hadoop 名称节点和日志节点的步骤

apache - Hbase ipc.RpcServer responseTooSlow 问题和区域服务器关闭