java—如何在同一个输入上运行两个不同的Map器,并将它们的输出发送到单个缩减器?

mwkjh3gx  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(329)

我有一些航班数据(每行包含始发地、目的地、航班号等),我需要对其进行处理以输出所有始发地和目的地之间的航班详细信息,我的想法是有两个Map器(一个输出目的地作为键,另一个输出始发地作为键,因此,reducer将中途停留位置作为键,将所有起点和终点作为一个值数组)。然后,我可以输出航班详细信息与一个中途停留的所有地点在减速器。
所以我的问题是如何在同一个输入文件上运行两个不同的Map器,并将它们的输出发送到一个reducer。
我读到了 MultipleInputs.addInputPath ,但我猜它需要不同的输入(或者至少两个相同输入的副本)。
我正在考虑使用一个工作流独立运行两个Map器作业,然后使用第三个身份Map器和reducer,在那里我将执行飞行计算。
有没有更好的解决办法(请不要让我使用hive,我还不习惯)任何关于使用mapreduce实现的指导都会很有帮助。谢谢。

vjhs03f7

vjhs03f71#

您的问题没有说明您是否希望混合/匹配(中途停留/不中途停留)。
因此,我将继续提出一个问题:那就是只考虑一次(而不是零次)中途停留。
在这种情况下,只需要两个map/reduce阶段。第一级Map器输出

(dest1, source1).

第一级减速机接收(dest1,数组(source1,source2,…)
第一级减速器然后将其元组写入hdfs输出目录。
现在执行第二阶段:Map器输入使用stage1 reducer输出作为其源目录。
第二阶段Map器读取:
(dest1,数组(source1,source2,…)
第二级Map器输出:

(dest2, (source1,dest1))

然后您的最终(阶段2)减速机接收:

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

它将数据写入hdfs输出。然后可以使用任何外部工具从hdfs读取这些结果。

mcdcgff0

mcdcgff02#

我想你只用一个制图器就可以做到。
Map器发出每个 (src,dst,fno,...) 两次输入记录,一次为 (src,(src,dst,fno,...)) 一旦 (dst,(src,dst,fno,...)) . 在reducer中,您需要为每个记录确定其键是源还是目标,并执行stop-over连接。使用一个标志来指示键的角色和二次排序可以使这更有效一些。
这样一来,只有一个单一的磁共振工作与一个Map器和一个减速机是必要的任务。

相关问题