2013-04-09 38 views
2

假设我们有3个mapper(m1,m2和m3)和2个reducers(r1和r2)。地图输出分区的大小?

每个减速器从由每个映射器生成的文件获取其输入的分区。

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

例如,减速器R1将收到INPUT_r1如:

INPUT_r1 =(分区从M1取出)+(分区从平方米取出)+(分区从立方米取出)

我想从mappers知道这些分区的大小?

回答

0

几件事情需要以找到映射器分区的大小要考虑的。

首先,我们应该认识到,在Hadoop中,partitioners执行合之前,因此,如果你在你的逻辑有一个组合,你将需要考虑它...如果它影响你试图找到的大小。这是相关的,如果你发现大小的另一种方式比我建议在这里。

其次,默认分区HashPartitioner分配大致相同的数字键的每个减速机。所使用的方法是:

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

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

注意,分割器只考虑了键,并忽略其可以向传播给减速器数据的不均匀分布的值。

我会怎么做才能找到大小,在HashPartitioner或自定义分区程序附近设置一个计数器,并计算每个键值对的大小。然后为每个分区器输出这个值。您可能需要跟踪每个分区发送数据的位置,因为分区器本身不知道他们将数据发送给谁。

很多这个问题的研究参考从MapReduce Book