2011-06-02 69 views
8

在一個典型的MapReduce設置(如Hadoop)中,1個任務使用多少個reducer,例如計數字?我對谷歌MapReduce的理解意味着只涉及1個縮小器。那是對的嗎?MapReduce中1個任務的縮減器數量

例如,單詞計數會將輸入分成N個塊,N個映射將運行,產生(單詞#)列表。 我的問題是,一旦Map階段完成,是否將只有一個reducer實例運行來計算結果?還是會有減速器並行運行?

+1

你的問題缺乏更多的上下文。你有一個特定的mapreduce框架,你指的是Hadoop。如果是的話,你問有多少減少「任務」將與每個地圖「任務」相關聯? – diliop 2011-06-02 17:31:32

+1

我已更新該問題。 – 2011-06-02 17:42:49

+0

簡而言之,將會有一個可配置數量的減速器(至少1個)。 – 2011-06-02 18:02:31

回答

13

簡單的答案是減速機的數量不一定是1,是的,減速機可以並行運行。正如我上面提到的,這是用戶定義或派生的。

爲了讓事情保持在上下文中,我將在本例中引用Hadoop,以便您瞭解事情的工作原理。如果您在Hadoop(0.20.2)中使用流式API,則必須明確定義您希望運行多少個reducer,因爲默認情況下只會啓動1個reduce任務。您通過將減速器的數量傳遞給-D mapred.reduce.tasks=# of reducers參數來實現此目的。 Java API將嘗試派生你需要的reducer的數量,但是你也可以明確地設置它。在這兩種情況下,您可以在每個節點上運行的減速器數量有一個硬性限制,並且使用mapred.tasktracker.reduce.tasks.maximummapred-site.xml配置文件中設置。

關於更概念性的說明,您可以查看hadoop wiki上的this文章,其中討論瞭如何選擇地圖數量和減少任務。

+0

什麼情況會導致Hadoop決定實例化Reducer類的多個實例?如果我們將減數的數量設置爲1,那麼它確實能夠保證所有密鑰都會轉到單個實例,而不管它有多少? – davidmdem 2017-02-06 14:32:14

+0

版本2.4.1之後的某個屬性:「mapred.tasktracker.reduce.tasks.maximum」已被棄用,新屬性名稱爲:「mapreduce.tasktracker.reduce.tasks.maximum」 請參見:http:// hadoop。 apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-common/DeprecatedProperties.html – xgMz 2017-03-16 22:37:13

1

這完全取決於情況。在某些情況下,你沒有任何減速器......一切都可以在地圖上完成。在其他情況下,你不能避免使用一個縮減器,但通常這是第二個或第三個縮減早期結果的map/reduce作業。但是,一般情況下,您想要使用很多Reducer,否則您將失去MapReduce的許多功能!例如,在字數統計中,您的映射器的結果是成對的。然後根據單詞對這些對進行劃分,以便每個縮減器都會收到相同的單詞,並且可以給你最終的總和。然後每個reducer輸出結果。如果你願意的話,你可以拍攝另一個將所有這些文件並列的M/R作業,並將它們連接起來 - 該作業只有一個縮小器。

1

我使用簡單的wordcount示例,它只適用於一個reducer。
如果你只想計算一個數字,你必須使用一個reducer(2個或更多reducer會給你2個或更多的輸出文件)。

如果這個reducer需要很長時間才能完成,您可以考慮鏈接多個reducer,其中reducers在下一個階段將總結前一個reducer的結果。

0

減速器並行運行。在更改配置文件mapred-site.xml或在運行作業命令時設置reducer或在程序中設置reducer時,您在作業中設置的還原器數量,還可以並行運行還原器數量。默認值爲1.默認值爲1.默認值爲1.

+0

請您詳細說明您的答案,並增加關於您提供的解決方案的更多描述。 – abarisone 2015-04-08 09:13:04

+0

在一項工作或一項任務中,您可以有多個減速機。您可以通過三種方式設置reducer的數量:1)在mapred-site.xml文件中設置chaning值。 2)以-D mapred.reduce.task = 4(可以是任何數字)運行作業時。 3)在驅動程序代碼中將您的配置對象設置爲conf.setNumReduceTask(4); – 2015-04-08 10:03:37

0

默認值爲1. 如果您正在考慮配置單元或pig,那麼reducer的數目取決於查詢,如group by,sum .....

如果你使用的是mapreduce代碼,它可以通過job/conf上的setNumReduceTasks來定義。

job.setNumReduceTasks(3); 

大部分時間是在覆蓋getPartition()時完成的,即您正在使用自定義分區程序

class customPartitioner extends Partitioner<Text,Text>{ 
    public int getPartition(Text key, Text value, int numReduceTasks){ 
    if(numReduceTasks==0) 
     return 0; 
    if(some logic) 
     return 0; 
    if(some logic) 
     return 1; 
    else 
     return 2; 
    } 
} 

有一件事您會注意到reducer的數量=輸出中的部分文件的數量。

讓我知道你是否有疑慮。

相關問題