在一個典型的MapReduce設置(如Hadoop)中,1個任務使用多少個reducer,例如計數字?我對谷歌MapReduce的理解意味着只涉及1個縮小器。那是對的嗎?MapReduce中1個任務的縮減器數量
例如,單詞計數會將輸入分成N個塊,N個映射將運行,產生(單詞#)列表。 我的問題是,一旦Map階段完成,是否將只有一個reducer實例運行來計算結果?還是會有減速器並行運行?
在一個典型的MapReduce設置(如Hadoop)中,1個任務使用多少個reducer,例如計數字?我對谷歌MapReduce的理解意味着只涉及1個縮小器。那是對的嗎?MapReduce中1個任務的縮減器數量
例如,單詞計數會將輸入分成N個塊,N個映射將運行,產生(單詞#)列表。 我的問題是,一旦Map階段完成,是否將只有一個reducer實例運行來計算結果?還是會有減速器並行運行?
簡單的答案是減速機的數量不一定是1,是的,減速機可以並行運行。正如我上面提到的,這是用戶定義或派生的。
爲了讓事情保持在上下文中,我將在本例中引用Hadoop,以便您瞭解事情的工作原理。如果您在Hadoop(0.20.2)中使用流式API,則必須明確定義您希望運行多少個reducer,因爲默認情況下只會啓動1個reduce任務。您通過將減速器的數量傳遞給-D mapred.reduce.tasks=# of reducers
參數來實現此目的。 Java API將嘗試派生你需要的reducer的數量,但是你也可以明確地設置它。在這兩種情況下,您可以在每個節點上運行的減速器數量有一個硬性限制,並且使用mapred.tasktracker.reduce.tasks.maximum
在mapred-site.xml
配置文件中設置。
關於更概念性的說明,您可以查看hadoop wiki上的this文章,其中討論瞭如何選擇地圖數量和減少任務。
什麼情況會導致Hadoop決定實例化Reducer類的多個實例?如果我們將減數的數量設置爲1,那麼它確實能夠保證所有密鑰都會轉到單個實例,而不管它有多少? – davidmdem 2017-02-06 14:32:14
版本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
這完全取決於情況。在某些情況下,你沒有任何減速器......一切都可以在地圖上完成。在其他情況下,你不能避免使用一個縮減器,但通常這是第二個或第三個縮減早期結果的map/reduce作業。但是,一般情況下,您想要使用很多Reducer,否則您將失去MapReduce的許多功能!例如,在字數統計中,您的映射器的結果是成對的。然後根據單詞對這些對進行劃分,以便每個縮減器都會收到相同的單詞,並且可以給你最終的總和。然後每個reducer輸出結果。如果你願意的話,你可以拍攝另一個將所有這些文件並列的M/R作業,並將它們連接起來 - 該作業只有一個縮小器。
我使用簡單的wordcount示例,它只適用於一個reducer。
如果你只想計算一個數字,你必須使用一個reducer(2個或更多reducer會給你2個或更多的輸出文件)。
如果這個reducer需要很長時間才能完成,您可以考慮鏈接多個reducer,其中reducers在下一個階段將總結前一個reducer的結果。
減速器並行運行。在更改配置文件mapred-site.xml或在運行作業命令時設置reducer或在程序中設置reducer時,您在作業中設置的還原器數量,還可以並行運行還原器數量。默認值爲1.默認值爲1.默認值爲1.
請您詳細說明您的答案,並增加關於您提供的解決方案的更多描述。 – abarisone 2015-04-08 09:13:04
在一項工作或一項任務中,您可以有多個減速機。您可以通過三種方式設置reducer的數量:1)在mapred-site.xml文件中設置chaning值。 2)以-D mapred.reduce.task = 4(可以是任何數字)運行作業時。 3)在驅動程序代碼中將您的配置對象設置爲conf.setNumReduceTask(4); – 2015-04-08 10:03:37
默認值爲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的數量=輸出中的部分文件的數量。
讓我知道你是否有疑慮。
你的問題缺乏更多的上下文。你有一個特定的mapreduce框架,你指的是Hadoop。如果是的話,你問有多少減少「任務」將與每個地圖「任務」相關聯? – diliop 2011-06-02 17:31:32
我已更新該問題。 – 2011-06-02 17:42:49
簡而言之,將會有一個可配置數量的減速器(至少1個)。 – 2011-06-02 18:02:31