【问题标题】:Understanding MapReduce in detail详细了解 MapReduce
【发布时间】:2014-10-05 00:14:25
【问题描述】:

我阅读了一篇关于 MapReduce 的文章,但我仍然对如何将作业拆分为任务(详细)以利用并行处理感到困惑,尤其是在以下情况下: 假设经过 Map 处理后,我们有 1 亿条记录(键/值对),有 5 个键,即 'key1'、key2'、'key3'、key4'、'key5'。第一个键有 9900 万条记录,其余键各有 25 万条。 如果我们有 3 个 worker 来做 reduce 任务,那么 Master 是如何分工的呢? 我读过每个键只由一个reducer处理,所以如果reducer必须处理'key1',那么它会比其他的工作更多,并且reducer的并行处理在这种情况下没有多大帮助?

【问题讨论】:

    标签: mapreduce


    【解决方案1】:

    具有相同key的输入数据不必分配给一个reducer。许多 reducer 可以使用相同的 key 共享输入数据。

    以归并排序为例。映射作业将一个数组分成几个子数组。多层reduce作业排序并将这些子数组合并回一个数组。无论数据如何排列成数组,复杂度仍然是 O(n log n)。实际上,合并排序在最佳情况和最坏情况下的复杂性与平均情况相同。归并排序算法对数组进行划分和合并的方式不受数据排列的影响。

    【讨论】:

      【解决方案2】:

      Map reduce 技术默认有几个假设:

      1. 作业不是相互依赖的,即您不必先运行 task1 即可获得其输出;然后使用 task1 的输出运行 task2;等等。

      2. 可以将作业划分为在所需执行能力和所用时间方面“相似”的任务。你的例子是这个假设的一个极端情况,因此 Map-reduce 不能很好地工作。

      3. 存在合理的划分策略,并且这种策略不会比运行任务花费更多的时间。

      4. 可以并行的任务是任务中的主要工作,它们不依赖于某些串行/单一资源。例如。磁盘 IO。

      实际上有很多问题满足以上 4 点(当然很多不满足,这就是 Map-reduce 不是通用解决方案的原因)。常见示例包括所有输入数据数量大、需要单独处理、计算时间昂贵但输入数据总大小较小的问题。例如

      • 确定一条线是否与可能有很多三角形面的 3D 结构相交,然后为每个三角形运行相交确定

      • 为大量金融产品定价

      希望以上内容有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-28
        • 1970-01-01
        • 1970-01-01
        • 2020-07-26
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        • 1970-01-01
        相关资源
        最近更新 更多