针对MapReduce,每一个小文件都是一个Block,都会产生一个InputSplit,最终每一个小文件都会产生一个mao任务,这样会导致同时启动太多Map任务,Map任务启动非常消耗性能,但是启动以后执行了很短时间就停止了,因为小文件的数据量太小。这样就会造成任务执行消耗的时间还没启动任务消耗的时间多,这样就会影响MapReduce执行效率。
解决方法:SequenceFile和MapFile
SequenceFile:
SequenceFile是Hadoop提供的一种二进制文件,这种二进制文件直接将<key,value>对序列化到文件中。一般对小文件可以使用这种文件合并,即将小文件的文件名作为key,文件的内容作为value序列化到大文件中
但是这个文件有一个缺点,它需要一个合并文件的过程,最终合并的文件会比较大,并且合并后的文件查看起来不方便,必须通过遍历才能查看里面的每一个小文件。所以SequenceFile可以理解为把很多小文件压缩成一个大的压缩包。
MapFile:
MapFile是排序后的SequenceFile,MapFile由两部分组成,分别使index和data。index作为文件的数据索引,主要记录了每个Record的key值,以及该Record在文件中的偏移位置。在MapFile杯访问的时候,索引文件会加载到内存,通过索引映射关系可以迅速定位到指定Record所在文件位置。因此,向对SequenceFile而言,MapFile的检索效率是高效的,缺点是会消耗一部分内存来存储index数据。