我正在研究一个涉及分析大量数据的项目,所以我最近发现了MapReduce,在我进一步深入研究之前,我想确保我的期望是正确的。
与数据的交互将在网络界面发生,因此响应时间至关重要,我想的是10-15秒的限制。假设在我对其进行任何分析之前,我的数据将被加载到分布式文件系统中,我可以从中获得什么样的性能?
假设我需要过滤一个结构良好的简单5GB XML文件,其中包含相当平坦的数据结构和10,000,000条记录。让我们说输出将产生100,000条记录。可能是10秒?
如果是,我在看什么样的硬件?
如果没有,为什么不呢? 击>
我把这个例子放下,但现在希望我没有。 5GB只是我所谈论的一个样本,实际上我会处理大量数据。 5GB可能是一天中一小时的数据,我可能想要识别符合特定条件的所有记录。
数据库对我来说真的不是一个选择。我想知道的是,使用MapReduce可以获得的最快性能是什么。它总是在几分钟或几小时?它永远不会秒?
答案 0 :(得分:10)
MapReduce适用于扩展大型数据集的处理,但并不是为了响应。例如,在Hadoop实现中,启动的开销通常需要几分钟。这里的想法是采取一个需要几天的处理工作,并将其降低到几小时,或几小时到几分钟等。但是你不会为了响应网络请求而开始一项新工作,并期望它能够完成时间回应。
要了解为何会出现这种情况,请考虑MapReduce的工作方式(一般情况,高级概述):
一堆节点接收部分节点 输入数据(称为拆分)和do 一些处理(地图步骤)
中间数据(输出来自 最后一步)重新划分 具有相同键的数据最终结束 一起。这通常需要一些 节点之间的数据传输。
reduce节点(不是 必然与映射器不同 节点 - 一台机器可以做到 连续多个工作)执行 减少步骤。
收集并合并结果数据 生成最终输出集。
虽然Hadoop等尝试尽可能保持数据局部性,但在处理过程中仍然存在大量的混乱。仅此一项就可以阻止您使用分布式MapReduce实现来支持响应式Web界面。
编辑:正如Jan Jongboom指出的那样,MapReduce非常适合预处理数据,因此Web查询可以很快,因为他们不需要进行处理。考虑从大量网页创建倒排索引的着名示例。
答案 1 :(得分:3)
MapReduce是一个通用术语。您可能想问一下具有作业控制功能的全功能MapReduce框架(如Hadoop)是否适合您。答案仍然取决于框架,但通常,MapReduce框架的作业控制,网络,数据复制和容错功能使其适用于需要几分钟,几小时或更长时间的任务,这可能是简短而正确的答案对你而言。
如果您的任务可以在独立的映射器之间拆分并与一个或多个reducer结合使用,那么MapReduce范例可能对您有用,并且您可以使用的语言,框架和基础结构可以利用它。
MapReduce和数据库之间没有必要区别。像SQL这样的声明性语言是抽象并行性的好方法,可查询的MapReduce框架(如HBase)也是如此。 This article讨论了k-means算法的MapReduce实现,并以纯SQL示例结束(假设服务器可以并行化它)。
理想情况下,开发人员根本不需要了解管道。 Erlang examples喜欢展示功能语言功能如何处理过程控制。
另外,请记住,有轻量级方法可以使用MapReduce,例如bashreduce。
答案 2 :(得分:2)
MapReduce的分布式实现(如Hadoop)不适合处理5GB XML
如果您有许多5GB文件,那么您可以使用hadoop来分发分割。您还可以使用它来跨文件合并结果,并将结果存储为一种格式,以便快速查询以供您的Web界面使用,如其他答案所述。
答案 3 :(得分:2)
我最近在一个系统上工作了大约120GB /小时,有30天的历史。我们最终出于组织原因使用Netezza,但我认为Hadoop可能是一个合适的解决方案,具体取决于您的数据和查询的详细信息。
请注意,XML非常详细。您的主要成本之一是读/写磁盘。如果可以,请选择更紧凑的格式。
群集中的节点数取决于磁盘和CPU的类型和数量。您可以假设您将受到磁盘速度的限制。如果您的7200rpm磁盘可以以50MB / s的速度扫描,并且您希望在10s内扫描500GB,那么您需要1000个节点。
您可能希望使用亚马逊的EC2,您可以在这里使用Hadoop群集并按分钟付费,或者您可以在其基础架构上运行MapReduce作业。
答案 4 :(得分:0)
听起来你可能想要的是一个很好的老式数据库。不像map / reduce那么时髦,但通常足以满足这样的小型工作。根据您的过滤需要的灵活性,您可以将您的5GB文件导入SQL数据库,也可以自己实现自己的索引方案,方法是将记录存储在不同的文件中,将所有内容存储在巨大的哈希表中,或任何适合您需要的东西。