假设我们有3个映射器(m1,m2和m3)和2个减速器(r1和r2)。
每个reducer都会从每个映射器生成的文件中获取其输入分区。
从作业历史记录中,我可以提取每个reduce任务的总输入, 但我想知道每个映射器对这个减速器输入的贡献吗?
例如,reducer r1将接收INPUT_r1,例如:
INPUT_r1 =(从m1获取的分区)+(从m2获取的分区)+(从m3获取的分区)
我想知道映射器中这些分区的大小?
答案 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