書接上文:解決小文件多的另外一個辦法是使用SequenceFile。
實驗一:用Java code把指定文件夾下的所有小文件打包成SequenceFile
代碼如下:
執行完該java 程序後,hdfs上面生成了SequenceFile: /sfile/sfile.seq
我們可以用命令"hadoop dfs -text /sfile/sfile.seq" 以text file的格式(而非二進制格式)查看該sequencefile 的內容 。
實驗二:用Java code讀取SequenceFile內容
代碼如下:
執行該java 程序後便可以把SequenceFile裏面的內容挨條讀出。
實驗三:用SequenceFile當作MapReduce Job的輸入
需要說明的是:在MR job裏面需要指定對應的FileInputFormat,比如“conf.setInputFormat(SequenceFileAsTextInputFormat.class)”。
執行完後,雖然SequenceFile裏面包含了很多的小文件,但是可以看到Job啓動的Map數量只有2——這樣也驗證了SequenceFile可以較好地解決小文件過多的問題。
簡單總結一下:通過使用SequenceFile不僅可以減少NameNode的壓力,同樣也可以來減少map的數量。不過,它的代價是:需要花工夫創建該SequenceFile。