我想在sort / shuffle之后只将输出的前10条记录移动到reducer。这可能吗?
原因是:我要查找文件中计数最多的10个项目。但是,我知道映射阶段的结果将到达已经排序的reducer。因此,我不想在地图制作者中进行排序,而是在“洗牌”和“排序”之后只传递前10行。到减速机。这将允许reducer只对原始记录的子集进行排序。
有没有办法做到这一点?
答案 0 :(得分:1)
您可以通过为作业编写自定义Combiner
来实现此目的。
MapReduce
职位的不同阶段是:
Mapper -> Partitioner -> Sorting -> Combiner -> Reducer.
现在Combiner
逻辑只读取前10(n)个记录并且不和所有其他记录不一致。 Reducer
只会从每个Mapper
/ Combiner
收到10条记录。
@K246
提供的评论:
来自haodop权威指南(第4版):在写入磁盘之前,线程首先将数据划分为与最终将被发送到的reducer相对应的分区。在每个分区中,后台线程按键执行内存中排序,如果有组合器函数,则在排序的输出上运行。
答案 1 :(得分:0)
当你在文件中说至少10个时......是针对每个映射器还是整个输入。 如果对于每个映射器,则必须在所有映射器的reducer处再次聚合。然后正如@YoungHobbit指出的那样,Combiner将完成这项工作。
如果您需要从整个输入文件中获取至少10个,那么我认为您需要使用单个reducer处理它并相应地输出。
另外,你在最后一行说过,reducer只会对子集进行排序。你的意思是你在Reducer中再次排序,或者在reducer中只为输入的子集执行某些逻辑。