[英]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.