簡體   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