地图输出分区的大小?

时间:2013-04-09 17:45:49

标签: hadoop mapper reducers

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

每个reducer都会从每个映射器生成的文件中获取其输入分区。

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

例如,reducer r1将接收INPUT_r1,例如:

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

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

1 个答案:

答案 0 :(得分:0)

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

首先,我们应该理解,在Hadoop中,分区器在组合器之前执行,所以如果你的逻辑中有一个组合器,你需要考虑它...如果它影响你的尝试找到大小。如果您发现的尺寸与我建议的尺寸不同,则这是相关的。

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

public int getPartition(K2 key, V2 value, int numReduceTasks) {

     return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}

请注意,分区程序仅考虑密钥并忽略可能导致传播给reducer的数据分布不均匀的值。

我要做的是找出尺寸,在HashPartitioner或自定义分区和帐户附近设置一个计数器,用于每个人收集的键 - 值对尺寸。然后为每个分区打印此值。您可能需要跟踪每个分区发送其数据的位置,因为分区器本身不知道他们将数据发送给谁。

此问题的大量研究参考MapReduce Book