CombineTextInputFormat 用于小文件过多的场景
过程:
首先将输入目录下所有文件大小,依次和设置的 setMaxInputSplitSize 值比较,
如果小于设置的最大值,逻辑上划分一个块。
如果大于设置的最大值且大于两倍,则以最大值切割一块;
当剩余数据大小超过最大值且不大于最大值2倍,此时将文件均分成 2 个虚拟存储块(防止出现太小切片)
测试举例:
1、setMaxInputSplitSize 值为 4M
有 4 个小文件大小分别为 1.7M、5.1M、3.4M 以及 6.8M 这四个小文件,
则虚拟存储之后形成 6 个文件块,大小分别为:
1.7M,(2.55M、2.55M),3.4M 以及(3.4M、3.4M)
最终会形成 3 个切片,大小分别为:
(1.7+2.55)M,(2.55+3.4)M,(3.4+3.4)M
切片数量:3,启用3个MapTask
2、如果setMaxInputSplitSize 值为 20M
4个文件总大小为17M
则会形成1个切片,17M
切片数量:1,启用1个MapTask