如何将特定记录发送到我的所有减速机?
我知道partitioner类及其功能,但是我没有找到任何简单的方法来确保一个记录被所有的reducer使用。
基本上,分区器有以下方法:
int getPartition(K2 key,
V2 value,
int numPartitions)
我的第一个想法是让分区器和Map器按如下方式协作:Map器不断输出记录的次数等于reduce任务的次数,分区器返回所有整数(从0到numpartitions-1),这样可以确保记录到达所有分区。
有没有其他更聪明的方法来解决这个问题?例如,对于需要发送到所有分区的记录,我返回-1,当框架看到返回的-1时,它会为我这样做。
1条答案
按热度按时间nle07wnf1#
分区器不是那样工作的。它的工作是查看键(通常)和值(很少)以确定应该将该对发送到哪个reducer。这种情况发生在Map器之后和还原器之前。
相反,您(Map器)应该能够询问上下文以获得可以回答缩减器(分区)总数的配置。然后,Map器可以输出一个复杂的键,该键包含所需的实际键和分区号。你知道要写多少次,因为Map器可以找到减速机的数量(见上文)。分区器所要做的就是分解复合键值,提取目标reducer索引并返回该索引。
顺便说一下,这意味着如果您使用这种技术来发送计数(如果您正在排序)或其他元数据,以便稍后在处理中使用,那么您的实际数据键必须遵循相同的复合格式。事实上,您可能需要在复合键中包含一个指示符来描述它是什么类型的键/值对(例如,1=真实数据,0=处理元数据)。