[英]Hadoop MapReduce: Possible to define two mappers and reducers in one hadoop job class?
我有兩個獨立的java類用於執行兩個不同的mapreduce作業。 我可以獨立運行它們。 它們運行的輸入文件對於這兩個作業都是相同的。 所以我的問題是,是否可以在一個java類中定義兩個映射器和兩個reducer
mapper1.class
mapper2.class
reducer1.class
reducer2.class
然后喜歡
job.setMapperClass(mapper1.class);
job.setmapperClass(mapper2.class);
job.setCombinerClass(reducer1);
job.setCombinerClass(reducer2);
job.setReducerClass(reducer1);
job.setReducerClass(reducer2);
這些設置方法是否實際覆蓋了以前的方法或添加新方法? 我嘗試了代碼,但它執行了唯一的最新給定的類,這讓我認為它會覆蓋。 但是必須有一種方法可以做到這一點嗎?
我問這個的原因是我只能讀取輸入文件一次(一個I / O),然后處理兩個map reduce作業。 我也想知道如何將輸出文件寫入兩個不同的文件夾。 目前,兩個作業都是獨立的,需要輸入和輸出目錄。
您可以使用MultipleInputs和MultipleOutputs類,但兩個映射器的輸出將同時用於兩個reducer。 如果兩個映射器/減速器對的數據流確實彼此獨立,則將它們保持為兩個單獨的作業。 順便說一句,MultipleInputs將運行您的映射器而不進行更改,但是必須修改reducer才能使用MultipleOutputs
根據我的理解,使用map-reduce和Hadoop流,你可以鏈接多個映射器和reducer,其中一個消耗另一個的輸出
但是你不應該同時運行不同的映射器和縮減器。 映射器本身依賴於不處理的塊。 Mapper應該根據該決定進行實例化,而不是可用於該作業的各種mapper。
[編輯:根據您的評論]
我不認為這是可能的。 你可以鏈(減少器將從映射器接收所有輸入。你可以對它們進行排序,但你不能專門運行獨立的映射器和減速器組。
我認為你可以做的是,即使你同時從兩個減速器接收到映射器的輸入,你也可以使映射器輸出(K,V)這樣你可以在你的減速器中區分哪個映射器是(K,V)的起源。 這樣,兩個減速器都可以在選擇性(K,V)對上進行處理。
ChainMapper類允許在單個Map任務中使用多個Mapper類。 例如,請看這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.