好吧,我不确定是否是 MapReduce 解决了这个问题,但肯定不会只有 MapReduce 才能解决您提出的所有这些问题。但这里有一些重要的事情需要考虑,这使得对来自不同机器上所有这些 TB 数据的查询具有如此低的延迟是可行的:
- 分布式计算:分布式并不意味着索引简单地分布在不同的机器上,它们实际上是沿着不同的集群复制的,这允许大量用户执行不同的查询,检索时间很短(是的,大公司可以负担得起这么多机器);
- 缓存:缓存极大地减少了执行时间,无论是用于爬取步骤,用于检索页面,还是用于结果的排名和展示;
- 大量调整:所有上述和非常有效的算法/解决方案只有在实施也有效的情况下才能有效。有大量(硬编码)优化,例如引用位置、压缩、缓存;它们通常都适用于加工的不同部分。
考虑到这一点,让我们尝试解决您的问题:
但我认为对每一个可能的查询的结果进行索引是不可行的
是的,它会,实际上是不可行的,为每一个可能的查询都有结果。世界上有无数个术语(即使您假设只会输入正确拼写的术语),并且来自这些n -> inf
术语的查询数量呈指数级增长(2^n
)。那么做了什么?缓存。但是如果有这么多查询/结果,哪些要缓存?缓存策略。最频繁/流行/与用户相关的查询是缓存的查询。
谷歌硬件的硬件延迟不会很大吗?即使 Google 中的数据都存储在 TB/s SSD 中
如今,有了如此高度发达的处理器,人们倾向于认为每一个必须在一秒钟(或更短)内完成并且处理大量数据的可能任务,都必须由具有多核和大量内存的极其强大的处理器处理。然而,支配市场的一件事是金钱,投资者对浪费它不感兴趣。那么做了什么?
偏好实际上是拥有大量机器,每台机器都使用简单/可访问(就成本而言)的处理器,这降低了构建大量集群的成本。是的,它确实有效。如果您考虑简单的性能测量,主要瓶颈总是归结为磁盘。但是一旦有这么多机器,就可以负担得起将东西加载到主内存,而不是在硬盘上工作。
存储卡对我们这些普通人来说很贵,但对于一次购买大量此类卡的企业来说却非常便宜。由于成本不高,因此拥有大量内存来加载索引并保持缓存在手边不是问题。而且由于机器太多,不需要超快的处理器,因为您可以将查询定向到不同的地方,并拥有负责处理特定地理区域的机器集群,这允许更专业的数据缓存,甚至更好的响应次。
MapReduce 是否有助于解决这个问题?
虽然我不认为使用或不使用 MapReduce 是 Google 内部的受限信息,但我并不熟悉这一点。但是,Google 的 MapReduce 实现(肯定不是Hadoop)必须有很多优化,其中很多都涉及到上面讨论的方面。因此,MapReduce 的架构可能有助于指导计算的物理分布方式,但还有许多其他点需要考虑以证明查询时间的这种速度是合理的。
好的,所以我知道热门搜索可以缓存在内存中。但是不受欢迎的搜索呢?
下图显示了各种查询如何发生的曲线。您可以看到有三种主要类型的搜索,每一种都拥有大约 1/3 的查询量(曲线下方的区域)。该图显示了幂律,并强化了较小的查询最受欢迎的事实。后三分之一的查询仍然可以处理,因为它们包含的单词很少。但是,通常由非经验用户的查询组成的所谓模糊查询集合,并不是查询中可以忽略的部分。
并且存在新解决方案的空间。由于不仅仅是一两个查询(而是其中的三分之一),它们必须有相关的结果。如果您在 Google 搜索中输入的内容过于晦涩难懂,则返回结果列表不会花费更长的时间,但很可能会向您显示它推断您想说的内容。或者它可能只是声明没有包含此类术语的文档 - 或者甚至将您的搜索减少到 32 个单词(这只是在我这里的随机测试中发生的)。
有数十种适用的启发式方法,可能是忽略某些单词,或者尝试将查询分解为更小的单词,并收集最流行的结果。所有这些解决方案都可以进行定制和调整,以尊重可行的等待时间,比如不到一秒钟?:D