關於hadoop中的map過程,個人理解是每個map系統會開啓一個JVM進程來處理,map之間相互並行,map函數內串行。這樣的想法是否正確?函數
因爲想在hadoop集羣上算一個初始輸入數據很少,可是計算很複雜的程序,但願經過mapreduce來達到並行計算的目的。能夠經過job.setNumReduceTasks(0);
語句設置reduce
個數爲0,只使用map
來計算。可是設置map
的個數時遇到了問題:新的API中job
沒有相似setNumMapTasks()
這樣的方法; 在運行時加入參數-D mapreduce.map.tasks=2
這樣的參數也無效。oop
查過好多資料,好像是說map
的個數取決於block_size
、total_size
等參數。可是都說的是1.x版本的設置,hadoop 2.2.0上並無找到mapred.map.tasks
、mapred.min.split.size
等對應的設置方法。大數據
因爲個人輸入文件只有一個文件,並且不算是「大數據」,只是單純想在hadoop上實現並行,因此我但願可以設置一個最少的map
數目,以便能在各個計算節點上並行。請問我應該如何設置?code
事隔10天后無人回答,再次自問自答(— . —!)。最近看到一本書,上面介紹自定義InputFormat
來控制map個數以及存儲位置。稍微看了下FileInputFormat
的接口,發現竟然有setMaxInputSplitSize()
這個靜態方法。(本身之前怎麼沒發現!! 也怪本身懶,不肯意去找) 在run
方法中加了這麼一句FileInputFormat.setMaxInputSplitSize(job, 1048576)
, 再次運行貌似有效,程序生成了6個map來運行。orm
但感到無法解釋的有兩點:接口
1.此處設置的值爲1048576(1M),個人輸入文件有20.95MB,若是最大份片大小爲1M的話應該有20多個map。其中必然有更細緻的判斷,還得研究如下相應處理的代碼才能解決;
2. 6個map全在同一個節點上運行,沒有分到不一樣節點上;進程
個人環境爲hadoop 2.2.0,我曾經試過修改dfs.blocksize
等配置參數,可是彷佛都沒有生效。不知道爲何會出現配置參數無效的狀況。hadoop
補充:剛纔瞭解到最終的分片大小splitSize
受到maxsize
、minsize
以及blocksize
的影響。設置FileInputFormat.setMinInputSplitSize(job, 1)
後,map數果真達到了20。it