每次運行我的Hadoop程序時,都需要更改映射器和縮減器的數量。有沒有辦法從命令行(當我運行程序時)將mappers和reducer的數量傳遞給我的程序,然後使用args
來檢索它?如何將參數傳遞給Hadoop中的主程序
回答
通過使用-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的數量。
重要的是要明白,你不能真正指定地圖任務的數量。最終地圖任務的數量被定義爲輸入拆分的數量,這取決於您的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.tasks
和mapred.reduce.tasks
,所以你可以用這些參數運行作業:
-D mapred.map.tasks=42 -D mapred.reduce.tasks
他們會直接解析您的GenericOptionParser
並自動填充您的Configuration
對象。請注意,-D和屬性之間有一個空格,這很重要,否則這將被解釋爲JVM參數。
這裏是a good link如果你想知道更多關於這個。
謝謝。但是如果我想傳遞的參數不是配置預定義的參數,並且是用戶定義的參數呢? –
@Hessam你的問題是關於傳遞已經預定義的mapper和reducer的數量,但顯然如果你想擁有自己的參數,你需要做自己的邏輯,你可以從'extraArgs'變量中獲得剩餘的參數在我的例子中。 –
- 1. 將參數傳遞給Hadoop映射器
- 2. 的Hadoop MapReduce的如何將字符串參數傳遞給
- 3. 如何將參數傳遞給進程
- 4. 如何將參數傳遞給Perl/Tk中的子程序?
- 5. 將參數傳遞給子程序
- 6. 將參數傳遞給EXE程序集
- 7. 將參數傳遞給應用程序
- 8. Makefile將參數傳遞給C程序
- 9. 如何將參數傳遞給python Hadoop串流作業?
- 10. 如何將參數傳遞給傳遞給mapPartitions的函數?
- 11. 如何將命令行參數傳遞給gradle中的主類?
- 12. 將參數傳遞給OWIN主機
- 13. 將主要參數傳遞給方法
- 14. Python瓶:如何將參數傳遞給函數處理程序
- 15. 如何將參數傳遞給我的處理程序
- 16. 如何將參數傳遞給Event.observe的處理程序?
- 17. 如何將參數傳遞給C#程序的powershell腳本?
- 18. 如何將非常長的參數列表傳遞給程序?
- 19. 如何在調試時將參數傳遞給我的程序?
- 20. 如何將參數傳遞給加載的swf應用程序?
- 21. 如何將命令行參數傳遞給我的主函數?
- 22. 如何將參數傳遞給c多線程中的線程
- 23. 如何將參數傳遞給傳遞給itertools.groupby的keyfunc?
- 24. 如何將兩個參數傳遞給model.fetch()在主幹中?
- 25. 如何將參數傳遞給ServiceHost的
- 26. 如何將參數傳遞給函數?
- 27. 如何將參數傳遞給函數
- 28. 如何將參數傳遞給Google Apps腳本調試程序?
- 29. 如何將參數傳遞給事件處理程序
- 30. 方法如何將參數傳遞給處理程序?
謝謝。但是如果我想傳遞的參數不是配置預定義的參數,並且是用戶定義的參數呢? –
然後你可以用類似的方式設置它。 'configuration.set'或job.setNumReduceTasks() – greedybuddha
'-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