我如何 运行 同一输入上的两个不同的映射器并将它们的输出发送到单个减速器?

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

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

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

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

我正在考虑 运行使用工作流独立地连接两个映射器作业,然后是第三个身份映射器和缩减器,我将在其中进行飞行计算。

有没有比这更好的解决方案? (请不要让我使用 Hive,我还不太习惯)任何关于使用 mapreduce 实施的指导都会很有帮助。谢谢

您的问题没有具体说明您是否希望一起 mix/match(stopover/no 中途停留)。

所以我将继续提出的问题:那只考虑一个(不是零个)中途停留。

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

(dest1, source1). 

一级减速器接收 (dest1, Array(source1, source2, ...)

第一阶段 reducer 然后将其元组写入 hdfs 输出目录。

现在进行第二阶段:mapper 输入使用 Stage1 reducer 输出作为其源目录。

第二阶段映射器读取:

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

第二阶段映射器输出:

 (dest2, (source1,dest1))

然后你的最终(stage2)reducer 收到:

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

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

我想你可以用一个 Mapper 来完成。

Mapper 发出每个 (src,dst,fno,...) 输入记录两次,一次作为 (src,(src,dst,fno,...)),一次作为 (dst,(src,dst,fno,...))。 在 Reducer 中,您需要为每条记录确定其键是源还是目标,然后进行中途连接。使用标志来指示键的作用和辅助排序可以使这更有效一些。

这样一来,任务只需要一个 MR 作业,其中包含一个 Mapper 和一个 Reducer。