一、什么是小文件
小文件一般是指明显小于Hadoop的block size(hadoop 1.x中默认是64M,hadoop 2.x中默认是128M)的文件。Hadoop的block size一般是64MB,128MB或者256MB,现在一般趋向于设置的越来越大。后文要讨论的内容为什么会基于128MB,这也是CDH中的默认值。为了方便后面的讨论,这里假定如果文件大小是小于block size的75%,则定义为小文件。但小文件不仅是指文件比较小,如果Hadoop集群中的大量文件略大于block size,同样也会存在小文件问题。
比如,假设block size是128MB,但加载到Hadoop的所有文件都是136MB,就会存在大量8MB的block。处理这种“小块”问题你可以调大block size来解决,但解决小文件问题却要复杂的多。
调整block size大小公式:computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M
算法分析: (默认切片大小就是block块大小)
max(minSize, min(maxSize,blockSize))
min(maxSize,blockSize)取maxSize,blockSize之间的最小值
max(minSize, min())取minSize, min()之间的最大值
blockSize=128MB
所以增加切片大小有要调整 min(maxSize,blockSize)中maxSize值
减小切片大小调整minSize值.
具体两个方法如下:
FileInputFormat.setMaxInputSplitSize(job, size);
FileInputFormat.setMinInputSplitSize(job, size);
二、小文件是如何来的
一个Hadoop集群中存在小文件问题是很正常的,可能的原因如下:
1. 现在我们越来越多的将Hadoop用于(准)实时计算,在做数据抽取时处理的频率可能是每小时,每天,每周等,每次可能就只生成一个不到10MB的文件。
2.数据源有大量小文件,未做处理直接拷贝到Hadoop集群。
3.MapReduce作业的配置未设置合理的reducer或者未做限制,每个reduce都会生成一个独立的文件。另外如果数据倾斜,导致大量的数据都shuffle到一个reduce,然后其他的reduce都会处理较小的数据量并输出小文件。
三、为什么hadoop中会有小文件的问题
Hadoop的小文件问题主要是会对NameNode内存管理和MapReduce性能造成影响。Hadoop中的每个目录、文件和block都会以对象的形式保存在NameNode的内存中。根据经验每个对象在内存中大概占用150个字节。如果HDFS中保存2000万个文件,每个文件都在同一个文件夹中,而且每个文件都只有一个block