簡體   English   中英

Hadoop MapReduce:可以在一個hadoop作業類中定義兩個映射器和縮減器嗎?

[英]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作業。 我也想知道如何將輸出文件寫入兩個不同的文件夾。 目前,兩個作業都是獨立的,需要輸入和輸出目錄。

您可以擁有多個映射器,但在一個作業中,您只能擁有一個reducer。 您需要的功能是MultipleInputMultipleOutputGenericWritable

使用MultipleInput ,您可以設置映射器和相應的inputFormat。 這是我關於如何使用它的帖子

使用GenericWritable ,您可以在reducer中分隔不同的輸入類。 這是我關於如何使用它的帖子

使用MultipleOutput ,您可以在同一個reducer中輸出不同的類。

您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM