6

如何将特定记录发送给我的所有减速器?

我知道 Partitioner 类及其作用,但我没有看到任何简单的方法可以确保记录发送到所有减速器。

基本上,Partitioner 有这个方法:

 int getPartition(K2 key,
             V2 value,
             int numPartitions)

我的第一个想法是让 Partitioner 和 Mapper 协作如下:Mapper 不断输出记录的次数等于 reduce 任务的数量,并且 Partitioner 以这种方式返回所有整数(从 0 到 numPartitions-1)确保记录到达所有分区。

有没有其他更聪明的方法来解决这个问题?例如,我为需要发送到所有分区的记录返回 -1,并且框架在看到返回的 -1 时为我执行此操作。

4

1 回答 1

5

分区器不是这样工作的。它的工作是查看键(通常)和值(很少)以确定该对应该发送到哪个减速器。这发生在 mapper 之后和 reducer 之前。

相反,您(映射器)应该能够向上下文询问可以回答减速器(分区)总数的配置。然后,您的映射器可以输出一个复杂的键,其中包含您想要的实际键和分区号。您知道要写多少次,因为映射器可以找出减速器的数量(见上文)。分区器所要做的就是分解复合键值,提取目标减速器索引并返回该索引。

顺便说一句,这意味着如果您使用此技术发送计数(如果您正在排序)或其他元数据以供稍后在处理中使用,那么您的真实数据键必须遵循相同的复合格式。事实上,您可能必须在复合键中包含一个描述键/值对类型的指示符(例如,1=真实数据,0=处理元数据)。

于 2012-08-23T00:38:49.173 回答