如何使用 Map Reduce 改进聚合处理时间?
Posted
技术标签:
【中文标题】如何使用 Map Reduce 改进聚合处理时间?【英文标题】:How can I improve aggregation processing time with Map Reduce? 【发布时间】:2014-11-14 14:26:19 【问题描述】:我正在尝试提高聚合查询的速度。我的想法是使用 Map Reduce 创建一个新集合并在其上运行聚合。这会减少处理时间吗?有什么缺点?
【问题讨论】:
如果是这样,那谁说不准呢? 您打算在每次要运行聚合时都运行 MapReduce,还是只打算不时运行 MapReduce 以更频繁地更新运行聚合的集合? MR 会不时出现,因为它目前需要大约 173 秒。我想至少将聚合时间从 0.7 秒提高到 0.3 秒。因此,我创建了与 MR 的聚合依赖。这是我担心的。以后会不会因此而产生问题? 我改写它以减少基于意见的内容。如果这不是您想要的,请随时重新编辑。 @Christian,我想投票,但我仍然有 10 名声望。非常感谢您的关心。我希望...我能长得更快...通常我像疯子一样投票...我确实喜欢 Quora。您也可以开始投票支持初学者的问题 :-) 以便他们获得更快的声誉。 【参考方案1】:是的,它可以工作。这是提高查询速度的常见模式。但是 MongoDB 在这种情况下比较特殊,因为 Map Reduce 需要 javascript 求值,而聚合框架是原生实现的,因此aggregation is faster。
我建议将概念与技术分开。在批处理作业中进行预计算仍然是一个好主意,但您应该使用聚合框架而不是 Map Reduce。
使用批处理作业的缺点是
您只能查询批处理作业中运行的内容,因此在插入新数据和检索数据之间会有延迟。 只有在您能够降低实时查询的复杂性时才会更快。例如,您的新查询应该比没有批处理作业时读取更少的文档。 您的应用程序占用了更多磁盘空间,因为您正在创建一个额外的集合。 它增加了复杂性。因此,从实时聚合开始,只有当它成为性能问题时,才进行预先计算。为了进一步改善延迟,您可以考虑实施Lambda architecture。它通过尽可能预先计算结果将查询时间降至最低。
这种架构方法试图平衡延迟、吞吐量和容错性,方法是使用批处理来提供全面且准确的预计算视图,同时使用实时流处理来提供动态视图。两个视图输出可以在演示之前合并。
【讨论】:
克里斯,非常感谢您的回答和大量有关我关注的信息。我将继续学习有关 Lambda 架构的更多信息。以上是关于如何使用 Map Reduce 改进聚合处理时间?的主要内容,如果未能解决你的问题,请参考以下文章
FlinkFlink 批处理模式Map端数据聚合 NormalizedKeySorter
Cassandra 是不是支持聚合功能或 Map Reduce 等任何其他功能?