假设我们有3个Map器(m1,m2和m3)和2个还原器(r1和r2)。每个reducer从每个Map器生成的文件中获取其输入分区。从工作历史中,我可以提取每个reduce任务的总输入,但是我想知道每个Map器对这个reducer输入的贡献?例如,减速机r1将接收一个输入,例如:输入_r1=(从m1取分区)+(从m2取分区)+(从m3取分区)我想知道这些分区的大小从Map?
3phpmpom1#
为了从Map器中找到分区的大小,需要考虑几个问题。首先,我们应该明白,在hadoop中,分区是在组合器之前执行的,所以如果您的逻辑中有一个组合器,那么您需要考虑它。。。如果它影响你寻找尺寸的尝试。这是相关的,如果你觉得大小的另一种方式比我建议这里。第二,默认的分区器 HashPartitioner 为每个减速器指定大致相同数量的键。使用的方法是:
HashPartitioner
public int getPartition(K2 key, V2 value, int numReduceTasks) { return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; }
请注意,分区器只考虑键,而忽略了值,这会导致分发给还原器的数据分布不均匀。我要做的是在你家附近设一个柜台,看看尺寸 HashPartitioner 或自定义分区器,并说明每个分区所收集的键值对大小。然后为每个分区器打印这个值。您可能需要跟踪每个分区将其数据发送到哪里,因为分区程序本身不知道将其数据发送给谁。很多关于这个问题的研究都是从mapreduce的书中引用的
1条答案
按热度按时间3phpmpom1#
为了从Map器中找到分区的大小,需要考虑几个问题。
首先,我们应该明白,在hadoop中,分区是在组合器之前执行的,所以如果您的逻辑中有一个组合器,那么您需要考虑它。。。如果它影响你寻找尺寸的尝试。这是相关的,如果你觉得大小的另一种方式比我建议这里。
第二,默认的分区器
HashPartitioner
为每个减速器指定大致相同数量的键。使用的方法是:请注意,分区器只考虑键,而忽略了值,这会导致分发给还原器的数据分布不均匀。
我要做的是在你家附近设一个柜台,看看尺寸
HashPartitioner
或自定义分区器,并说明每个分区所收集的键值对大小。然后为每个分区器打印这个值。您可能需要跟踪每个分区将其数据发送到哪里,因为分区程序本身不知道将其数据发送给谁。很多关于这个问题的研究都是从mapreduce的书中引用的