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