如果MapReduce的input是一些小文件(文件size小於hdfs的默認block大小),那麼MapReduce job將會爲每一個小文件開啓一個單獨的map——最後導致有大量的map,而每一個map其實只處理一小部分數據,卻花了很大的時間在map自身的啓動和停止上。
以下的實驗將會驗證小文件數量對map數量的影響,以及input爲har文件時map數量的情況。
實驗一:WordCount——input爲5個小文件
執行WordCount job:$hadoop jar hadoop-example.jar wordcount /input01 /output01
Job執行完後,我們可以看到該Job一共啓動了5個map:
實驗二:WordCount——input爲6個小文件
執行WordCount job:$hadoop jar hadoop-example.jar wordcount /input01 /output01
Job執行完後,我們可以看到該Job一共啓動了6個map:
實驗三:WordCount——input爲1個har文件,它包含了6個小文件
首先,我們把上面的6個小文件打包成爲一個har文件:
hadoop archive -archiveName files.har -p /input01 /input-har
查看該har文件:
執行WordCount job:$hadoop jar hadoop-example.jar wordcount har://hdfs-host:9000/input-hars/files.har /output-hars
Job執行完後,我們可以看到該Job同樣根據har包中的小文件數量一共啓動了6個map:
從MapReduce job的角度看,har 文件並沒有帶來什麼變化。但是,由於使用har文件歸檔小文件,hdfs上的文件數變少了,namenode的壓力也變小了。