有关于级联/烫伤如何优化地图侧评估的通知 他们使用所谓的部分聚合。它实际上是比组合器更好的方法吗?一些常见的hadoop任务(例如字数)是否有任何性能比较?如果是这样,hadoop 将来会支持这个吗?
2 回答
在实践中,部分聚合比使用组合器有更多的好处。
组合器有用的情况是有限的。此外,组合器优化了任务所需的吞吐量,而不是减少的数量——这是一个微妙的区别,它加起来显着的性能增量。
在大型分布式工作流中,部分聚合的用例范围更广。此外,部分聚合可用于优化工作流所需的作业步骤数。
示例显示在https://github.com/Cascading/Impatient/wiki/Part-5中,它使用CountBy
和SumBy
部分聚合。如果您回顾一下该项目在 GitHub 上的代码提交历史,之前使用了GroupBy
and Count
,这导致了更多的减少。
对于某些类型的聚合更好。级联聚合对于可以聚合的内容要灵活一些。 从级联站点(重点是我的):
级联不支持所谓的 MapReduce 组合器。组合器非常强大,因为它们减少了 Mappers 和 Reducers 之间的 IO。当您可以在 Map 端计算一些值并将它们组合在 Reducer 中时,为什么要将所有 Mapper 数据发送到 Reducers。但是组合器仅限于关联和交换函数,例如 'sum' 和 'max'。并且为了工作,必须对 Map 任务发出的值进行序列化、排序(反序列化和比较)、再次反序列化和操作,然后再对结果进行序列化和排序。组合器用 CPU 换取 IO 的收益。
级联通过提供一种机制来执行部分聚合 Map 端并将它们组合到 Reduce 端,从而采用不同的方法。但是 Cascading 选择通过缓存值(达到阈值)来用内存换取 IO 增益。这种方法绕过了不必要的序列化、反序列化和排序步骤。它还允许实现任何聚合函数,而不仅仅是关联和交换函数。