2013-04-24 37 views
15

有幾個地方說Hadoop作業中默認的reducer數是1.您可以使用mapred.reduce.tasks來手動設置reducer的數量。Hive如何選擇一個工作減少的人數?

當我運行一個蜂房的工作(在Amazon EMR,AMI 2.3.3),它具有減速大於一的一些數字。看看作業設置,有些東西已經設置了mapred.reduce.tasks,我認爲Hive。它如何選擇這個數字?

注:這裏有一些消息運行一個蜂房的工作,應該是一個線索,而:

... 
Number of reduce tasks not specified. Estimated from input data size: 500 
In order to change the average load for a reducer (in bytes): 
    set hive.exec.reducers.bytes.per.reducer=<number> 
In order to limit the maximum number of reducers: 
    set hive.exec.reducers.max=<number> 
In order to set a constant number of reducers: 
    set mapred.reduce.tasks=<number> 
... 
+0

好問題。具體而言,何時配置單元選擇「編譯時確定的減少任務數量」以及何時選擇「根據輸入數據大小估計」? – ihadanny 2013-04-25 14:39:08

+0

補充說,在下面的回答中, – 2013-04-26 01:14:54

回答

16

1也許是因爲香草Hadoop的默認安裝的。 Hive覆蓋它。

在開源蜂巢(EMR和可能)

# reducers = (# bytes of input to mappers) 
      /(hive.exec.reducers.bytes.per.reducer) 

This post表示默認hive.exec.reducers.bytes.per.reducer爲1G。

您可以限制使用hive.exec.reducers.max由此試探生產減速機的數量。

如果你確切地知道你想減速的數量,你可以設置mapred.reduce.tasks,這將覆蓋所有的試探。 (默認情況下,它設置爲-1,表示Hive應該使用它的啓發式方法。)

在某些情況下 - 比如說'從T'選擇count(1) - Hive會將reducers的數量設置爲1,而不管輸入數據的大小。這些被稱爲「完整聚合」 - 如果查詢所做的唯一事情是完全聚合 - 那麼編譯器知道來自映射器的數據將被減少到微不足道的數量,並且運行多個減速器沒有意義。

+0

儘管完整的總量會將輸出數據量從一個顯着的值減少,但更多的減速器可以幫助減少運行時間。我們正面臨Hive的問題,它擁有1100多個映射器,並且只有一個reducer。完成排序需要幾個小時。 – dedunumax 2015-02-01 05:32:59

+0

該鏈接不再有效。很好發佈Apache鏈接。 – 2016-04-12 02:22:38