目录
一、FileInputFormat切片机制(默认的切片机制)
前言
我们在指定driver类的main方法向yarn提交任务的时候需要对数据进行切片,数据切片是逻辑上的,并不会对磁盘上的文件进行真正的拆分存储
提示:以下是本篇文章正文内容,下面案例可供参考
一、FileInputFormat切片机制(默认的切片机制)
FileInputFormat是mr中默认的切片机制。
1、切片原理
(1)遍历整个目录,对每个文件进行单独的切片处理。
(2)先拿到文件的大小,文件大小与128M的1.1倍进行比较,也就是与128*1.1=140.8M进行比较,如果文件大小 > 140.8,则以128M将文件切出一片;剩下的继续与140.8进行比较,只要大于就切一片;直到剩余部分小于等于140.8,将其分为一片。
2、切片案例
3、问题与缺点
(1)为什么与128M的1.1倍相比较?为了切片均匀,防止生成过小的切片。如果一个文件> 128M,与128M的1.1倍相比较,并且按照128M进行切片那么形成的最小切片>12.8。
(2)默认切片机制的缺点:无论文件多小他都会形成一个切片,启动一个map task。所以FileInputFormat切片机制不适合输入大量小文件。
二、CombineTextInputFormat切片机制
CombineTextInputFormat能够从逻辑上将小文件合并成大文件。
1、切片原理
(1)根据实际情况设置虚拟存储切片最大值:CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 这里设置4m
(2)先形成虚拟的存储,遍历整个目录下的所有文件,依次和setMaxInputSplitSize值相比较(下面简称max)
文件大小 < max,该文件直接形成一个虚拟存储。
max < 文件大小 < max*2,把该文件平分成两个虚拟存储。
max*2 < 文件大小,先形成一个max大小的虚拟存储,剩余的继续循环比较。
(3)根据虚拟存储形成切片,每一个虚拟存储与max比较
虚拟存储 > max,形成一个切片。
虚拟存储 < max,和下一个虚拟存储形成一个切片。
2、切片案例
总结
如果目录下存在大量小文件我们解决方式有两种:
(1)从源头上解决,将文件合并之后在添加hdfs进行处理
(2)使用CombineTextInputFormat进行处理