假设我们有3个mapper(m1,m2和m3)和2个reducers(r1和r2)。地图输出分区的大小?
每个减速器从由每个映射器生成的文件获取其输入的分区。
从作业历史中,我可以提取每个减少任务的总输入量, 但我想知道每个映射器对这个减速器输入量的贡献量吗?
例如,减速器R1将收到INPUT_r1如:
INPUT_r1 =(分区从M1取出)+(分区从平方米取出)+(分区从立方米取出)
我想从mappers知道这些分区的大小?
假设我们有3个mapper(m1,m2和m3)和2个reducers(r1和r2)。地图输出分区的大小?
每个减速器从由每个映射器生成的文件获取其输入的分区。
从作业历史中,我可以提取每个减少任务的总输入量, 但我想知道每个映射器对这个减速器输入量的贡献量吗?
例如,减速器R1将收到INPUT_r1如:
INPUT_r1 =(分区从M1取出)+(分区从平方米取出)+(分区从立方米取出)
我想从mappers知道这些分区的大小?
几件事情需要以找到映射器分区的大小要考虑的。
首先,我们应该认识到,在Hadoop中,partitioners执行合之前,因此,如果你在你的逻辑有一个组合,你将需要考虑它...如果它影响你试图找到的大小。这是相关的,如果你发现大小的另一种方式比我建议在这里。
其次,默认分区HashPartitioner
分配大致相同的数字键的每个减速机。所使用的方法是:
public int getPartition(K2 key, V2 value, int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
注意,分割器只考虑了键,并忽略其可以向传播给减速器数据的不均匀分布的值。
我会怎么做才能找到大小,在HashPartitioner
或自定义分区程序附近设置一个计数器,并计算每个键值对的大小。然后为每个分区器输出这个值。您可能需要跟踪每个分区发送数据的位置,因为分区器本身不知道他们将数据发送给谁。
很多这个问题的研究参考从MapReduce Book