实际上,Hadoop/MapReduce/Mahout需要多少台机器才能加速非常并行的计算?

实际上,Hadoop/MapReduce/Mahout需要多少台机器才能加速非常并行的计算?,hadoop,machine-learning,mapreduce,mahout,Hadoop,Machine Learning,Mapreduce,Mahout,我需要做一些繁重的机器学习计算。我在局域网上有少量空闲的机器。我需要多少台机器才能使用hadoop/mapreduce/mahout分发计算,从而比在没有这些分布式框架的单机上运行要快得多?这是一个计算开销与收益的实际问题,因为我假设只在两台机器之间分配总时间比不分配并只在一台机器上运行更糟糕(因为分配计算所涉及的所有开销) 技术说明:一些繁重的计算是非常并行的。只要每台机器都有自己的原始数据副本,所有这些数据都是有效的。请参阅 Amdahl定律是一个模型,用于在假设问题规模在并行化时保持不变的

我需要做一些繁重的机器学习计算。我在局域网上有少量空闲的机器。我需要多少台机器才能使用hadoop/mapreduce/mahout分发计算,从而比在没有这些分布式框架的单机上运行要快得多?这是一个计算开销与收益的实际问题,因为我假设只在两台机器之间分配总时间比不分配并只在一台机器上运行更糟糕(因为分配计算所涉及的所有开销)

技术说明:一些繁重的计算是非常并行的。只要每台机器都有自己的原始数据副本,所有这些数据都是有效的。

请参阅

Amdahl定律是一个模型,用于在假设问题规模在并行化时保持不变的情况下,算法并行化实现相对于串行算法的预期加速比之间的关系。例如,如果对于给定的问题规模,一个算法的并行化实现可以任意快速地运行该算法12%的运算(而其余88%的运算是不可并行的),阿姆达尔定律规定并行化版本的最大加速比为1/(1–0.12)=1.136倍于非并行实现的速度

没有细节,很难给出更详细的答案。

一个“普通”Java程序和一个基于Hadoop、MapReduce的实现是非常不同的,很难比较。Hadoop并没有将你的程序并行化一点;它是以完全不同的形式自上而下写的

Hadoop有一些开销:只是启动一个作业的开销,以及启动映射器和还原器之类的工作人员的开销。它引入了更多的时间用于序列化/反序列化数据、在本地写入数据以及将数据传输到HDFS

基于Hadoop的实现总是会消耗更多的资源。所以,除非你无法避免,否则这是必须避免的。如果可以在一台机器上运行非分布式计算,最简单实用的建议是不要分布式。省省麻烦吧

在Mahout推荐程序的例子中,我可以非常粗略地告诉您,Hadoop作业所需的计算量是相同数据上非分布式实现的2-4倍。显然,这在很大程度上取决于算法和算法调整的选择。但给你一个数字:我不会为少于4台机器的Hadoop集群而烦恼


显然,如果您的计算无法安装在您的一台机器上,那么您别无选择,只能进行分发。然后,折衷的办法是你可以允许多少挂钟时间,以及你可以投入多少计算能力。对AdDHL定律的引用是正确的,虽然它没有考虑Hadoop的显著开销。例如,要并行化N种方式,您至少需要N个映射器/还原器,并产生N倍的映射器/还原器开销。还有一些固定的启动/关闭时间。

我知道这个问题已经得到了回答,但我会全力以赴。我不能给你一个一般的经验法则。性能的提高实际上取决于许多因素:

  • 所有组件/算法的并行/互斥程度
  • 数据集的大小
  • 数据集的前后处理[包括拆分/映射和缩减/浓缩]
  • 网络流量
  • 如果你有一个高度连接的算法,比如贝叶斯网、神经网、马尔可夫、PCA和EM,那么hadoop程序的很多时间都是在处理、拆分和重组实例。[假设每个实例有大量节点(超过一台机器可以处理)。如果出现这种情况,网络流量将成为更大的问题


    如果你有一种算法,比如路径查找或模拟退火,那么很容易将实例分离到它们自己的map/reduce作业中。这些类型的算法可以非常快。

    另一个方面是什么是你的瓶颈,迫使你使用mapreduce。如果你在你的单机中有合理的数据大小,你只需要探测sp然后你可以更喜欢使用GPU实现。即使在一台机器上,它们也更容易安装和使用,并有很好的效果。

    一根绳子有多长?@Shaggy Frog,Jeff Foster。对不起,一开始我不太清楚。问题不是“它能快多少”,而是“我需要多少台机器才能让它更快,而不是更慢,或者只是收支平衡。”也就是说,这是关于运行hadoop、map reduce、mahout的计算成本。我的错误是没有弄清楚。