我需要做一些重型机器学习计算。我在LAN上闲置了少量机器。为了使用hadoop / mapreduce / mahout将计算分配到比没有这些分布式框架的单个机器上运行要快得多,我需要多少台机器?这是计算开销与收益之间的实际问题,因为我假设仅在2台机器之间进行分配,总体时间将比不分发和简单地在单个机器上运行更糟糕(仅仅因为分配计算所涉及的所有开销)。 p>
技术说明:一些繁重的计算是非常可并行的。只要每台机器都有自己的原始数据副本,所有这些都是。
答案 0 :(得分:8)
“普通”Java程序和基于Hadoop的基于MapReduce的实现是非常不同的动物,很难比较。它不像Hadoop并行化你的程序一点点;它以完全不同的形式从上到下书写。
Hadoop有开销:只是开始工作的开销,以及启动像mappers和reducer这样的工作者。它引入了更多的时间来序列化/反序列化数据,在本地编写数据并将其传输到HDFS。
基于Hadoop的实现总是会消耗更多资源。所以,除非你无法避免,否则这是要避免的。如果您可以在一台计算机上运行非分布式计算,最简单的实用建议是不分发。省去麻烦。
在Mahout推荐人的情况下,我可以非常粗略地告诉你,Hadoop作业比同一数据上的非分布式实现多出2-4倍的计算量。显然,这在很大程度上取决于算法和算法调整选择。但是给你一个数字:我不会打扰少于4台机器的Hadoop集群。
显然,如果你的计算机无法适应你的计算机,你别无选择,只能分发。然后,权衡是你可以允许的壁钟时间与你可以投入多少计算能力。提到Amdahl定律是正确的,尽管它没有考虑Hadoop的重大开销。例如,要并行化N个方法,您至少需要N个映射器/缩减器,并且每个映射器/缩减器开销会产生N倍。还有一些固定的启动/关闭时间。
答案 1 :(得分:6)
请参阅Amdahl's Law
Amdahl定律是算法的并行化实现相对于串行算法的预期加速之间的关系的模型,假设在并行化时问题大小保持不变。例如,如果对于给定的问题大小,算法的并行化实现可以任意快速地运行算法操作的12%(而其余88%的操作不可并行化),Amdahl定律指出并行化版本的最大加速比是非平行实现的1 /(1 - 0.12)= 1.136倍。
如果没有具体细节,很难给出更详细的答案。
答案 2 :(得分:1)
我知道这已经得到了解答,但我会把帽子扔进戒指。我不能给你一般的经验法则。性能的提高实际上取决于很多因素:
如果你有一个高度连接的算法,比如贝叶斯网,神经网络,马尔可夫,PCA和EM,那么hadoop程序的很多时候都会处理,拆分和重新组合实例。 [假设每个实例有大量节点(超过1台机器可以处理)。如果您遇到这种情况,网络流量将成为一个问题。
如果您有路径搜索或模拟退火等算法,那么很容易将实例分离到他们自己的map / reduce作业中。这些类型的算法可以非常快。
答案 3 :(得分:0)
另一个方面是你的瓶颈是什么迫使你使用mapreduce。如果您的单机中数据大小合理,并且您只是探测速度提升,那么您可以更喜欢使用GPU实现。即使在具有良好结果的单台机器中,它们也更易于设置和使用。