Hadoop向所有reducer发送记录

时间:2012-08-22 23:36:28

标签: hadoop mapreduce partitioning reduce partitioner

如何向所有减速机发送特定记录?

我知道Partitioner类及其功能,但我没有看到任何简单的方法来确保记录转到所有reducers。

基本上,分区程序有这种方法:

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

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

还有其他更智能的解决方法吗?例如,对于我需要发送到所有分区的记录,我返回-1,框架在看到返回的-1时为我做了。

1 个答案:

答案 0 :(得分:5)

分区程序不能正常工作。它的工作是查看密钥(通常)和值(很少)来确定该对应该发送到哪个减速器。这发生在映射器之后和reducer之前。

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

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