首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >架构-如何在10,000台机器上高效地抓取网络?

架构-如何在10,000台机器上高效地抓取网络?
EN

Stack Overflow用户
提问于 2011-10-31 21:15:16
回答 2查看 671关注 0票数 5

假设我有一个由10,000台机器组成的网络。我想使用所有这些机器来尽可能快地抓取网络。所有页面只能下载一次。此外,不能有单点故障,我们必须最小化机器之间所需的通信数量。您将如何实现这一点?

有什么比使用consistent hashing在所有机器上分配负载并最小化它们之间的通信更有效的吗?

EN

回答 2

Stack Overflow用户

发布于 2012-02-04 05:19:59

  1. 使用像Hadoop这样的分布式Map Reduction系统来划分工作空间。
  2. 如果你想变得更聪明,或者在学术环境中这样做,那么尝试一个Nonlinear dimension reduction.
  3. Simplest实现可能是在名称空间键上使用哈希函数,例如域名或URL。使用Chord为每台计算机分配要处理的哈希值的子集。
票数 2
EN

Stack Overflow用户

发布于 2011-10-31 21:48:01

一种想法是使用工作队列(目录或DB),假设您将计算出满足冗余标准的存储。

\检索

\retrieve\server1

\检索\服务器...

\检索\server10000

\进程中

\完成

1.)所有要作为种子的页面都将被散列,并使用散列作为文件根放入队列中。

2.)在将队列放入队列之前,请检查完成队列和正在处理的队列,以确保不会重新排队

3.)每个服务器从检索队列中检索随机批(1-N)个文件,并尝试将其移动到专用队列

4.)未通过重命名过程的文件被假定为已被另一个进程“声明”

5.)可以移动的文件将被处理,在进程内目录中放置一个标记,以防止重新排队。

6.)下载该文件并将其放入\Complete队列中

7.)清除进程内目录和服务器目录中的文件

8.)每运行1,000次,就会尝试将最旧的10个正在处理的文件从它们的服务器队列移回常规检索队列,从而检查这些文件。如果服务器挂起,这将有所帮助,而且还应该对速度较慢的服务器进行负载平衡。

对于检索、进程内和完整服务器,大多数文件系统讨厌一个目录中的数百万个文件,请根据散列的字符将存储划分为多个段\abc\def\123\将是文件abcdef123FFFFFF…的目录。如果你要扩展到数十亿的下载量。

如果您正在使用mongo DB而不是常规的文件存储,那么这些问题就可以避免,并且您可以从分片等…中受益

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7954254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档