CombineTextInputFormat是用于合并小文件的。通过调用setMaxInputSplitSize方法设置maxSize。
有两个主要步骤,
(1)虚拟存储,先按照指定规则把指定目录下的文件都切分为小于maxSize的更小文件。当然,原本就小于maxSize的小文件不做切分。只有大于maxSIze的小文件会切分的比maxSize更小。切分后的所有文件都是小于maxSize的,当然,这里说的切分后的文件不是真的切分成更小文件了,而是属于一种逻辑上的文件。。所以才叫做虚拟存储。
具体切分规则是:
将输入目录下所有文件大小,依次和设置的 setMaxInputSplitSize 值比较,
<1>如果不 大于设置的最大值,逻辑上划分一个块。
<2>如果输入文件大于设置的最大值且大于两倍, 那么以最大值切割一块;
<3>当剩余数据大小超过设置的最大值且不大于最大值 2 倍,此时 将文件均分成 2 个虚拟存储块(防止出现太小切片)。
<1>和<2>示例如图:
<3>的例子如下:
例如 setMaxInputSplitSize 值为 4M,输入文件大小为 8.02M,则先逻辑上分成一个 4M。剩余的大小为 4.02M,如果按照 4M 逻辑划分,就会出现 0.02M 的小的虚拟存储 文件,所以将剩余的 4.02M 文件切分成(2.01M 和 2.01M)两个文件。
(2)切片过程,如图:
总结:
(1)虚拟存储时切分的虚拟小文件大小都是小于maxSIze的。
(2)切分过程时把(1)虚拟存储的每个虚拟文件与之后的虚拟文件合并,直到合并的文件大于maxSize,此时把这部分虚拟文件作为一个split,然后再让下一个虚拟文件及其虚拟文件一个一个合并直到大于maxSize....这样就可以得到多个split了,每个split的大小都在maxSize到2*maxSize之间