Hadoop map-reduce v / s级联,这比基于处理时间的比较更好?

时间:2011-03-02 06:06:30

标签: hadoop

我使用级联以及M / R,与M / R相比,级联作业看起来很慢。看起来我慢了25%到50%。是真的还是我需要在级联中进行更多优化。

1 个答案:

答案 0 :(得分:11)

与手绘的原始MapReduce作业相比,我无法谈论级联作业的开销,因为它实际上取决于工作负载的复杂性,级联的版本,您编写每个作业的方式,亚马逊内部的天气或您的网络等。

也就是说,Cascading是MapReduce的抽象,会有一些开销。但作为一种抽象,它有机会更有效地做事(例如,1.2将在排序期间懒惰地反序列化数据,例如,原始MR开发人员需要通过Comparator实现手动为每个中间对象编码)。

我怀疑你是假设Cascading在默认值之上进行某种类型的集群配置优化。它不是。因此,如果您在没有设置任何不同Hadoop属性的情况下运行级联流,那么您可能只会在每个作业中看到一个reducer,因为它是Hadoop中的默认值(请参阅mapred-default.xml)。

或者你的工作很简单,它可以使用' Combiners',Cascading不直接支持,但使用Map端部分聚合有更灵活的替代方案。这类似于组合器,但它为cpu交换内存,并且它们不仅限于像Combiners这样的交换关联操作。以下是partial aggregation的更好描述。

我应该说,如果你的工作量足够简单(而且会保持简单)(和Hadoop is really justified here)你可以编写几个MR工作来满足它,你应该坚持下去(见下文)。

但我所做的工作(以及我作为Cascading的作者)在某些情况下会产生数十个(如果不是100个)MR作业。事实上,我实际上可以完成我的项目并在几天内获得结果,这超过了Cascading在某些情况下可能带来的轻微开销。例如,Cascading有一个快速失败的计划程序,也就是说,如果Flow中不满足所有数据/字段依赖性,它将不会在集群上运行级联流。

如果要将原始MR作业链接在一起,则不太可能拥有该功能。由于缺少只能在运行时识别的依赖性,因此您的工作负载更有可能在数小时后失败。

或者,您正在传递原始类型'业务对象'周围(为了获得编译器类型安全),这意味着您要么不必要地通过集群传递数据,要么在您更改上游或下游数据处理的业务规则时必须手动维护许多中间对象。

关于MR工作数量的另一点。降低Hadoop中工作负载成本的唯一方法是减少工作负载中的作业之间的IO。这通常是通过将更低效的算法替换为更好的算法来实现的,其代价是增加复杂性,添加更多作业以更智能地执行操作。因此,如果您认为自己只需要少量MR工作,并且在大规模运行时发现数据存在令人讨厌的瓶颈(这至少是我遇到的情况)。您可能需要对问题采取不同的方法,这可能会导致更多的工作。我知道这似乎违反直觉,但它发生了很多。在这种情况下,您会很高兴您正在使用抽象,您可以在问题域中保持头脑,而不是MapReduce域。

如果您真的关心性能,请随时通过电子邮件将级联邮件列表与您的代码通过电子邮件联系,我或社区将很乐意帮助您发现问题或在级联中发现任何问题。