繁体   English   中英

如何在同一输入上运行两个不同的映射器,并将其输出发送到单个reducer?

[英]How do I run two different mappers on the same input and have their output sent to a single reducer?

我有一些航班数据(每行包含起点,目的地,航班号等),我需要对其进行处理,以通过一个停留点输出所有起点和目的地之间的航班详细信息,我的想法是拥有两个映射器(一个输出目的地作为键另一个输出原点作为键,因此减速器将中途停留位置作为键,并将所有原点和目标作为值的数组)。 然后,我可以输出减速机中所有位置的一个中途停留的航班详细信息。

所以我的问题是如何在同一个输入文件上运行两个不同的映射器,并将它们的输出发送到一个reducer。

我读到有关MultipleInputs.addInputPath ,但我猜想它需要的输入是不同的(或同一输入的至少两个副本)。

我正在考虑使用工作流独立运行两个映射器作业,然后使用第三个Identity映射器和reducer来执行飞行计算。

有没有更好的解决方案呢? (请不要要求我使用Hive,现在还不满意)。有关使用mapreduce实施的任何指导确实会有所帮助。 谢谢。

您的问题未指定您是否要混合/匹配(中途停留/无中途停留)。

因此,我将继续陈述问题:仅考虑一次(而不是零)中途停留。

在这种情况下,只需有两个Map / Reduce阶段。 第一阶段Mapper输出

(dest1, source1). 

第一级reducer接收(dest1,Array(source1,source2,...)

然后,第一级减速器将其元组写入hdfs输出目录。

现在执行第二阶段:映射器输入将Stage1减速器输出用作其源目录。

第二阶段的映射器显示:

(dest1,Array(source1,source2,...))

第二阶段的映射器输出:

 (dest2, (source1,dest1))

然后,您的最终(stage2)reducer将收到:

(dest2,  Array( (source11,dest11), (source12, dest12), (source13, dest13) ,...)

并将该数据写入hdfs输出。 然后,您可以使用任何喜欢的外部工具从hdfs读取这些结果。

我认为您只需一个Mapper就可以做到。

映射器发出两次每个(src,dst,fno,...)输入记录,一次作为(src,(src,dst,fno,...)) ,一次作为(dst,(src,dst,fno,...)) (src,(src,dst,fno,...)) (dst,(src,dst,fno,...)) 在Reducer中,您需要为每条记录确定其键是源还是目标,然后执行停靠联接。 使用标志来指示键的作用和辅助排序可以使此操作更加有效。

这样,只需一个MR工作和一个Mapper和一个Reducer即可完成该任务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM