书接上文:解决小文件多的另外一个办法是使用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。

本文介绍了使用SequenceFile解决HDFS中小文件过多的问题。通过三个实验详细展示了如何将多个小文件打包为一个SequenceFile,如何读取SequenceFile的内容,以及如何将其作为MapReduce任务的输入。实验证明SequenceFile能有效减少NameNode的压力并降低Map任务数量。
1095

被折叠的 条评论
为什么被折叠?



