在 Hadoop 中更改文件拆分大小

我在HDFS目录中有一堆小文件。虽然文件的数量相对较小,但每个文件的处理时间却很大。也就是说,文件(的默认拆分大小)甚至需要几个小时才能处理完毕。64mbTextInputFormat

我需要做的是减少拆分大小,以便我可以利用更多的节点来完成一项工作。

所以问题是,如何通过比方说来拆分文件?我是否需要实现我自己的和为此,或者是否有任何要设置的参数?谢谢。10kbInputFormatRecordReader


答案 1

参数 mapred.max.split.size 可以按作业单独设置,这就是您正在寻找的。不要更改 dfs.block.size,因为这是 HDFS 的全局,可能会导致问题。


答案 2

Hadoop the Definitive Guide, page 203 “最大拆分大小默认为 Java long 类型可以表示的最大值。只有当它小于块大小时,它才会起作用,迫使拆分小于块。拆分大小由以下公式计算:

max(minimumSize, min(maximumSize, blockSize))

默认情况下

minimumSize < blockSize < maximumSize

所以拆分大小是blockSize

例如

Minimum Split Size 1
Maximum Split Size 32mb
Block Size  64mb
Split Size  32mb

Hadoop 处理少量大文件比处理大量小文件更好。其中一个原因是FileInputFormat以这样的方式生成拆分,即每个拆分都是单个文件的全部或部分。如果文件非常小(“小”意味着比HDFS块小得多),并且有很多,那么每个映射任务将处理非常少的输入,并且会有很多输入(每个文件一个),每个都会产生额外的簿记开销。比较一个1gb的文件,分为16个64mb块,10.000个左右的100kb文件。10.000 个文件每个使用一个映射,作业时间可能比具有单个输入文件和 16 个映射任务的等效文件慢数十或数百倍。



推荐