8

我正在从事一个处理大量数据分析的项目,因此我最近发现了 MapReduce,在我进一步深入研究之前,我想确保我的期望是正确的。

与数据的交互将通过 Web 界面进行,因此响应时间在这里很关键,我认为 10-15 秒的限制。假设在我对其进行任何分析之前,我的数据将被加载到分布式文件系统中,我可以从中获得什么样的性能?

假设我需要过滤一个简单的 5GB XML 文件,该文件格式良好,具有相当扁平的数据结构和 10,000,000 条记录。假设输出将产生 100,000 条记录。10秒可以吗?

如果是,我在看什么样的硬件?如果不是,为什么不呢?

我把这个例子放下了,但现在希望我没有。5GB 只是我所说的一个示例,实际上我会处理大量数据。5GB 可能是一天中一小时的数据,我可能想识别所有符合特定条件的记录。

数据库对我来说真的不是一个选择。我想知道的是使用 MapReduce 可以达到的最快性能是什么。总是在几分钟或几小时内?永远不会秒吗?

4

5 回答 5

11

MapReduce 非常适合扩展大型数据集的处理,但它的目的不是响应式的。例如,在 Hadoop 实现中,启动的开销通常只需要几分钟。这里的想法是进行一项需要几天时间的处理工作,并将其降低到几小时或几小时到几分钟等量级。但是您不会为了响应网络请求而开始一项新工作并期望它在是时候回应了。

要了解为什么会出现这种情况,请考虑 MapReduce 的工作方式(一般,高级概述):

  • 一堆节点接收部分输入数据(称为拆分)并进行一些处理(映射步骤)

  • 中间数据(来自最后一步的输出)被重新分区,使得具有相似键的数据最终在一起。这通常需要在节点之间进行一些数据传输。

  • reduce 节点(不一定与 mapper 节点不同——一台机器可以连续执行多个作业)执行 reduce 步骤。

  • 收集并合并结果数据以生成最终输出集。

虽然 Hadoop 等人试图尽可能地保持数据的局部性,但在处理过程中仍然会发生相当多的洗牌。仅此一项就应该使您无法支持具有分布式 MapReduce 实现的响应式 Web 界面。

编辑:正如 Jan Jongboom 所指出的,MapReduce 非常适合预处理数据,这样 Web 查询可以很快,因为它们不需要参与处理。考虑从大量网页创建倒排索引的著名示例。

于 2010-01-13T19:51:40.697 回答
2

MapReduce 的分布式实现(例如 Hadoop)不适合处理 5GB XML

  • Hadoop 最适合处理大量数据。虽然 5GB 是一个相当大的 XML 文件,但它可以很容易地在单台机器上处理。
  • Hadoop 作业的输入文件需要可拆分,以便文件的不同部分可以在不同的机器上处理。除非您的 xml 非常平坦,否则文件的拆分将是不确定的,因此您需要一个预处理步骤来格式化文件以进行拆分。

如果你有很多 5GB 的文件,那么你可以使用 hadoop 来分发分割。您还可以使用它来跨文件合并结果,并将结果以一种格式存储,以便您的 Web 界面使用快速查询,正如其他答案所提到的那样。

于 2010-01-13T20:07:28.717 回答
2

MapReduce 是一个通用术语。您可能想问一个功能齐全的具有作业控制的 MapReduce 框架,例如 Hadoop,是否适合您。答案仍然取决于框架,但通常,MapReduce 框架的作业控制、网络、数据复制和容错特性使其适用于需要几分钟、几小时或更长时间的任务,这可能是简短而正确的答案为你。

如果您的任务可以在独立的映射器之间拆分并与一个或多个减速器组合,并且您可用的语言、框架和基础设施让您可以利用这一点,那么 MapReduce 范式可能对您有用。

MapReduce 和数据库之间不一定有区别。像 SQL 这样的声明性语言是抽象并行性的好方法,可查询的 MapReduce 框架(如 HBase)也是如此。 本文讨论了 k-means 算法的 MapReduce 实现,并以纯 SQL 示例结束(假设服务器可以并行化它)。

理想情况下,开发人员根本不需要对管道了解太多。 Erlang 示例 喜欢展示函数式语言特性如何处理进程控制。

另外,请记住,有一些轻量级的方法可以使用 MapReduce,例如bashreduce

于 2010-01-13T22:43:40.437 回答
2

我最近在一个系统上工作,该系统处理大约 120GB/小时的历史,有 30 天的历史。出于组织原因,我们最终使用了 Netezza,但我认为 Hadoop 可能是一个合适的解决方案,具体取决于您的数据和查询的详细信息。

请注意,XML 非常冗长。您的主要成本之一是读取/写入磁盘。如果可以,请选择更紧凑的格式。

集群中的节点数量取决于磁盘和 CPU 的类型和数量。您可以粗略地假设您将受到磁盘速度的限制。如果你的 7200rpm 磁盘可以以 50MB/s 的速度扫描,而你想在 10 秒内扫描 500GB,那么你需要 1000 个节点。

您可能想要使用 Amazon 的 EC2,您可以在其中建立一个 Hadoop 集群并按分钟付费,或者您可以在他们的基础设施上运行 MapReduce 作业。

于 2010-01-19T12:17:34.770 回答
0

听起来您可能想要的是一个好的老式数据库。不像 map/reduce 那样流行,但对于像这样的小型工作来说通常足够了。根据过滤需要的灵活性,您可以将 5GB 文件导入 SQL 数据库,也可以自己实现自己的索引方案,将记录存储在不同的文件中,将所有内容存储在内存中的巨大哈希表中,或任何适合您需要的东西。

于 2010-01-13T20:33:34.263 回答