n-Shuffle and Sort

时间:2015-10-26 13:13:15

标签: hadoop mapreduce hadoop-streaming

我想在sort / shuffle之后只将输出的前10条记录移动到reducer。这可能吗?

原因是:我要查找文件中计数最多的10个项目。但是,我知道映射阶段的结果将到达已经排序的reducer。因此,我不想在地图制作者中进行排序,而是在“洗牌”和“排序”之后只传递前10行。到减速机。这将允许reducer只对原始记录的子集进行排序。

有没有办法做到这一点?

2 个答案:

答案 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中只为输入的子集执行某些逻辑。