combineTextInputFormat切片
1.切片机制
- 使用场景
CombineTextInputFormat用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理。
2.虚拟存储过程
- 将输入目录下所有文件按照文件名称字典顺序一次读入,记录文件大小,并累加计算所有文件的总长度。
- 根据是否设置setMaxInputSplitSize值,将每个文件划分成一个一个setMaxInputSplitSize值大小的文件
CombineTextInputFormat.setMaxInputSplitSize(job, 4194304); // 4m虚拟存储切片最大值设置可以根据实际的小文件大小情况来设置具体的值。
注意:当剩余数据大小超过setMaxInputSplitSize值且不大于2倍setMaxInputSplitSize值,此时将文件均分成2个虚拟存储块(防止出现太小切片)
例:
setMaxInputSplitSize值为4M,最后文件剩余的大小为4.02M,如果按照4M逻辑划分,就会出现0.02M的小的虚拟存储文件,所以将剩余的4.02M文件切分成(2.01M和2.01M)两个文件
3.切片过程
- 判断虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个切片
- 如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片
例:
有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
4. CombineTextInputFormat案例实操
- 需求:将输入的大量小文件合并成一个切片统一处理(准备四个文件)
- 运行WordCount案例实操(查看切片数)
- 在WordcountDriver中增加如下代码
- 驱动中(Driver类中)添加代码
// 如果不设置InputFormat,它默认用的是TextInputFormat.class job.setInputFormatClass(CombineTextInputFormat.class); //虚拟存储切片最大值设置20m CombineTextInputFormat.setMaxInputSplitSize(job, 4*1024*1024);
- 运行查看
版权声明:本博客为记录本人自学感悟,转载需注明出处!
https://me.csdn.net/qq_39657909