【问题标题】:Size of map output partitions?地图输出分区的大小?
【发布时间】:2013-04-01 07:02:32
【问题描述】:

假设我们有 3 个映射器(m1、m2 和 m3)和 2 个减速器(r1 和 r2)。

每个 reducer 从每个 mapper 生成的文件中获取其输入分区。

从作业历史中,我可以提取每个reduce任务的总输入, 但我想知道每个映射器对这个 reducer 输入的贡献?

例如reducer r1会收到一个INPUT_r1如:

INPUT_r1 = (从 m1 获取的分区) + (从 m2 获取的分区) + (从 m3 获取的分区)

我想知道映射器中这些分区的大小?

【问题讨论】:

    标签: hadoop mapper reducers


    【解决方案1】:

    为了从映射器中找到分区的大小,需要考虑几件事。

    首先,我们应该了解,在 Hadoop 中,分区器在组合器之前执行,因此,如果您的逻辑中有组合器,则需要考虑它...如果它影响您的尝试找到大小。如果您发现尺寸与我在此处建议的不同,这很重要。

    其次,默认分区器HashPartitioner 为每个reducer 分配大约相同数量的键。使用的方法是:

    public int getPartition(K2 key, V2 value, int numReduceTasks) {
    
         return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
    }
    

    请注意,partitioner 只考虑 key 而忽略 value,这可能导致传播到 reducer 的数据分布不均匀。

    要确定大小,我会在您的 HashPartitioner 或自定义分区器附近设置一个计数器,并说明每个人收集的键值对大小。然后为每个分区器打印此值。您可能需要跟踪每个分区将其数据发送到何处,因为分区器本身不知道他们将数据发送给谁。

    这个问题的很多研究都引用自MapReduce Book

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多