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