Ahm*_*dov 24 java hadoop mapreduce distributed-computing
我在HDFS目录中有一堆小文件.虽然文件的体积相对较小,但每个文件的处理时间量很大.也就是说,一个64mb文件,它是默认的分割大小TextInputFormat,甚至需要花费几个小时来处理.
我需要做的是减少分割大小,这样我就可以利用更多的节点来完成工作.
所以问题是,怎么可能通过让我们说分割文件10kb?我需要实现我自己InputFormat和RecordReader这一点,或有任何参数设置?谢谢.
小智 34
mapred.max.split.size您可以单独为每个作业设置的参数.不要更改,dfs.block.size因为这对于HDFS来说是全局的并且可能导致问题.
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个映射任务的等效文件慢几十或几百倍.