2013-05-27 72 views
4

每次運行我的Hadoop程序時,都需要更改映射器和縮減器的數量。有沒有辦法從命令行(當我運行程序時)將mappers和reducer的數量傳遞給我的程序,然後使用args來檢索它?如何將參數傳遞給Hadoop中的主程序

回答

1

通過使用-D參數,您可以指定映射器和縮減器的數量(以及您可以在配置中指定的任何參數)。只要你extends Configured,這適用於所有默認的Hadoop罐子和你自己的罐子。

hadoop jar myJar.jar -Dmapreduce.job.maps=<Number of maps> -Dmapreduce.job.reduces=<Number of reducers> 

從那裏你可以使用retreive值。

configuration.get("mapreduce.job.maps"); 
configuration.get("mapreduce.job.reduces"); 

或減速

job.getNumReduceTasks(); 

指定映射器與配置值將不起作用mapreduce.jobtracker.address is "local"時。查看Charles的答案,他解釋了Hadoop通常如何根據數據大小確定Mappers的數量。

+0

謝謝。但是如果我想傳遞的參數不是配置預定義的參數,並且是用戶定義的參數呢? –

+0

然後你可以用類似的方式設置它。 'configuration.set'或job.setNumReduceTasks() – greedybuddha

+0

'-D'和屬性之間應該有一個空格,例如https://books.google.be/books?id=6BmkBwAAQBAJ&lpg=PT205&ots=79NHaZ4PMn&dq=do %20not%20confuse%20setting%20hadoop%20properties&hl = nl&pg = PT205#v = onepage&q = do%20not%20confuse%20setting%20hadoop%20properties&f = false – Stefaan

7

重要的是要明白,你不能真正指定地圖任務的數量。最終地圖任務的數量被定義爲輸入拆分的數量,這取決於您的InputFormat實現。假設您有1TB的輸入數據,並且您的HDFS塊大小爲64MB,那麼Hadoop將計算大約16k個地圖任務,如果您指定的手動值小於16k,則它將被忽略,但會超過16k,使用。

要通過命令行傳遞,最簡單的方法是使用內置類GenericOptionsParser(描述here),該類將直接解析常見命令行Hadoop相關參數,如您正在嘗試執行的操作。好處是它允許你傳遞你想要的任何Hadoop參數,而不必稍後編寫額外的代碼。你會做這樣的事情:

public static void main(String[] args) { 
    Configuration conf = new Configuration(); 
    String extraArgs[] = new GenericOptionsParser(conf, args).getRemainingArgs(); 
    // do something with your non-Hadoop parameters if needed 
} 

現在你需要定義修改映射器和減速器的數量屬性分別mapred.map.tasksmapred.reduce.tasks,所以你可以用這些參數運行作業:

-D mapred.map.tasks=42 -D mapred.reduce.tasks 

他們會直接解析您的GenericOptionParser並自動填充您的Configuration對象。請注意,-D和屬性之間有一個空格,這很重要,否則這將被解釋爲JVM參數。

這裏是a good link如果你想知道更多關於這個。

+0

謝謝。但是如果我想傳遞的參數不是配置預定義的參數,並且是用戶定義的參數呢? –

+1

@Hessam你的問題是關於傳遞已經預定義的mapper和reducer的數量,但顯然如果你想擁有自己的參數,你需要做自己的邏輯,你可以從'extraArgs'變量中獲得剩餘的參數在我的例子中。 –

相關問題