整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

7.2.1.4. 小文件与CombineFileInputFormat

hadoop 花牛 7℃ 0评论

相对于大批量的小文件,Hadoop更合适处理少量的大文件。个原因是FilelnputFormat生成的分块是一个文件或该文件的一部分。如果文件很小(“小”意味着比HDFS的块要小很多),并且文件数量很多,那么每次map任务只处理很少的输入数据,(一个文件)就会有很多map任务,每次map操作都会造成额外的开销。请比较一下把1GB的文件分割成1664 MB块与100 KB的10000个块。10000个文件每个都需要使用一个map操作,作业时间比一个文件上的16map操作慢几十甚至几百倍。

CombineFilelnputFormat可以缓解这个问题,它是针对小文件而设计的。FilelnputFormat为每个文件产生 个分片,而 CombineFilelnputFormat 把多个文件打包到一个分片中以便每个mapper可以处理更多的数据。关键是,决定哪些块放入同一个分片时,CombineFilelnputFormat会考虑到节点和机架的因素,所以在典型MapReduce作业中处理输入的速度并不会下降。

当然,如果可能的话应该尽量避免许多小文件的情况,因为MapReduce处理数据的最佳速度最好与数据在集群中的传输速度相同,而处理小文件将增加运行作业而必需的寻址次数。还有,在HDFS集群中存储大量的小文件会浪费namenode的内存。一个可以减少大量小文件的方法是使用SequenceFile将这些小文件合并成一个或多个大文件:可以将文件名作为键(如果不需要键,可以用NullWritable等常量代替),文件的内容作为值。参见范例7-4。但如果HDFS中已经有大批小文件, CombineFilelnputFormat 方法值得一试。

CombineFilelnputFormat不仅可以很好地处理小文件,在处理大文件的时候也有好处。本质上,CombineFilelnputFormat使map 操作中处理的数据量与HDFS中文件的块大小之间的耦合度降低了。

如果mapper可以在几秒钟之内处理每个数据块,就可以把CombineFilelnputFormat的最大分片大小设成块数的较小的整数倍(通过mapred.max.split.size属性设置,以字节为单位),使毎个map可以处理多个块。这样,整个处理时间减少了,因为相对来说,少量mapper的运行,减少了运行大量短时mapper所涉及的任 务管理和启动开销。

由于CombineFilelnputFormat是一个抽象类,没有提供实体类(不同于FilelnputFormat),所以使用的时候需要一些额外的工作(希望日后会有一些通用的实现添加入库)。例如,如果要使CombineFilelnputFormatTextlnputFormat相同,需要创建一个 CombineFilelnputFormat的具体子类,并且实现getRecordReader()方法。

转载请注明:全栈大数据 » 7.2.1.4. 小文件与CombineFileInputFormat

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址