2017-02-14 56 views
-1

我必須將Mapper的輸出傳遞給我的Reducer。MapReduce Multiple Reduce任務

Reducer是數據之間的合併。因此,在映射器之後,Reducer會在第一次迭代中合併一些數據,更改鍵和重新合併以及第二次迭代,等等......

我嘗試使用job.setNumReduceTasks(4),但沒有任何反應。我只有1個輸出和一個簡單的System.out.println()放置在我的Reducer顯示器上,只顯示1條消息。

Job job = new Job(getConf()); 


job.setJarByClass(Driver.class); 
job.setJobName(this.getClass().getName()); 

FileInputFormat.setInputPaths(job, new Path(input)); 
FileOutputFormat.setOutputPath(job, new Path(output+System.nanoTime())); 

job.setMapperClass(KMMapper.class); 

job.setReducerClass(KMReducer.class); 
job.setNumReduceTasks(4); 

job.setMapOutputKeyClass(Text.class); 
job.setMapOutputValueClass(Text.class); 

job.setOutputKeyClass(Text.class); 
job.setOutputValueClass(Text.class); 

job.waitForCompletion(true); 

---------- ----------編輯

另外,請更新可能的I/P ADN O/P

你的問題

我必須實現一種新的數據聚類方式。

映射器是聚類算法,輸出是集羣中的點/鍵列表。

每個Reducer將集羣與相同的密鑰進行比較,如果它們是「相似的」,則reducer將其合併。減速器選擇新的鍵,輸出是新鍵/點列表。隨機選擇新密鑰和大量迭代,將比較所有初始羣集。

+1

job.setNumReduceTasks定義您將擁有多少個縮減器,而不是您應用多少次減少 – seneque

+0

以及如何將同一個縮減器應用4次或5次? –

+0

目前尚不清楚你需要的是什麼,但是你有沒有試過4次運行相同的算法(例如,使用for循環)?您不能多次運行reduce階段,因爲reducer總是在映射器之後運行(MapReduce中沒有還原作業,即使可以存在僅包含地圖的作業)。 – vefthym

回答

1

我必須把我的Mapper的輸出傳給我的 Reducer。

從上面的說明中,我可以理解您的數據必須按順序進行4次過濾/處理。要做os,MapReduce提供ChainMapperChainReducer

使用job.setNumReduceTasks(4);只會幫助並行運行4-Reducer任務運行,共享基於默認密鑰分區機制的映射器輸出(稱爲中間數據)。

從你的其他部分的問題中,可以引入自定義分區。因此,他們將鍵值對作爲鍵值列表排列。然後,根據所需的過濾機制,將結果合併到還原器中。

+0

我可以讀取:「ChainReducer類允許在Reducer任務內的Reducer之後鏈接多個Mapper類。「但是我想要相反的多個Reducer for Mapper –

+0

MapReduce中的多個reducer只是用於從中間數據中運行並行作業,它清晰而響亮,沒有reducer(連續)之後有reducer的機制 – srikanth

+0

如果我真的需要它有這樣的一個竅門嗎? –

0

通過聚類,你的意思是你需要分割數據嗎? 如果是這種情況,你需要添加分區邏輯(你可以提供一個範圍的鍵,所以這些鍵從映射器到一個特定的reducer。)

否則你可以做一件事情,完成後的第一個工作,應用鏈接,以便它進入下一個工作,在那裏你有一個身份映射器和Reducer邏輯來執行任何業務邏輯。

相關問題