在Hadoop中更改文件分割大小

Ahm*_*dov 24 java hadoop mapreduce distributed-computing

我在HDFS目录中有一堆小文件.虽然文件的体积相对较小,但每个文件的处理时间量很大.也就是说,一个64mb文件,它是默认的分割大小TextInputFormat,甚至需要花费几个小时来处理.

我需要做的是减少分割大小,这样我就可以利用更多的节点来完成工作.

所以问题是,怎么可能通过让我们说分割文件10kb?我需要实现我自己InputFormatRecordReader这一点,或有任何参数设置?谢谢.

小智 34

mapred.max.split.size您可以单独为每个作业设置的参数.不要更改,dfs.block.size因为这对于HDFS来说是全局的并且可能导致问题.

  • dfs.block.size不一定是全局的; 您可以将特定文件设置为具有与文件系统的默认值不同的块大小.我同意mapred.max.split.size可能是这种情况下的方法. (14认同)

Ahm*_*dov 23

Hadoop权威指南,第203页"最大分割大小默认为Java长类型可以表示的最大值.仅当它小于块大小时才有效,强制分割小于块.分割大小由公式计算:

max(minimumSize, min(maximumSize, blockSize))
Run Code Online (Sandbox Code Playgroud)

默认情况下

minimumSize < blockSize < maximumSize
Run Code Online (Sandbox Code Playgroud)

所以分割大小是 blockSize

例如,

Minimum Split Size 1
Maximum Split Size 32mb
Block Size  64mb
Split Size  32mb
Run Code Online (Sandbox Code Playgroud)

Hadoop使用少量大文件比使用大量小文件更好.其中一个原因是FileInputFormat以这样一种方式生成拆分,即每个拆分都是单个文件的全部或部分.如果文件非常小("小"意味着明显小于HDFS块)并且有很多文件,那么每个地图任务将处理很少的输入,并且会有很多(每个文件一个),每个都会增加额外的簿记费用.比较一个分成16个64mb块的1gb文件和10.000个左右的100kb文件.10.000个文件各使用一个映射,并且作业时间比具有单个输入文件和16个映射任务的等效文件慢几十或几百倍.